我想转身
x = [((1, ‘code’, ‘XXXX’), (1, ‘ref’, ‘112B’))]
进入[(1, (‘code’, ‘XXXX’), (‘ref’, ‘112B’))]
基本上第一个数字是键。
我尝试使用itertools.groupby
函数,但最终变得一团糟。
答案 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))
]