通过重复键使元组变平吗?

时间:2019-12-28 06:03:43

标签: python tuples

我想转身

x = [((1, ‘code’, ‘XXXX’), (1, ‘ref’, ‘112B’))]

进入[(1, (‘code’, ‘XXXX’), (‘ref’, ‘112B’))]

基本上第一个数字是键。

我尝试使用itertools.groupby函数,但最终变得一团糟。

2 个答案:

答案 0 :(得分:3)

您可以先使用collections.defaultdict将列表转换为临时字典,然后将其转换为所需的格式。

from collections import defaultdict

x = [((1, 'code', 'XXXX'), (1, 'ref', '112B'))]
temp = defaultdict(list)

for t in x[0]:
    temp[t[0]].append(t[1:])

print(temp)
# defaultdict(<class 'list'>, {1: [('code', 'XXXX'), ('ref', '112B')]})

final = [(k, *v) for k, v in temp.items()]
print(final)
# [(1, ('code', 'XXXX'), ('ref', '112B'))]

答案 1 :(得分:1)

如果您仍要使用itertools.groupby(),则可以尝试此解决方案。它首先使用itertools.chain.from_iterable()将嵌套元组列表展平为元组列表,然后将groupby()应用于按每个元组中的第一项进行分组。 operator.itemgetter可以访问分组方式key。另一种选择是使用key=lambda x: x[0]

from itertools import groupby, chain
from operator import itemgetter

x = [((1, "code", "XXXX"), (1, "ref", "112B"))]

groups = [
    (k, *tuple(x[1:] for x in g))
    for k, g in groupby(chain.from_iterable(x), key=itemgetter(0))
]

print(groups)

输出:

[(1, ('code', 'XXXX'), ('ref', '112B'))]

注意:这假设您的初始元组已排序。如果不是,则可以应用sorted()

groups = [
    (k, *tuple(x[1:] for x in g))
    for k, g in groupby(sorted(chain.from_iterable(x)), key=itemgetter(0))
]