我在处理其中的元组列表时遇到问题。
如果我有一个像这样的元组列表:
list = [('1', 'a'), ('2', 'b'), ('3', 'c'), ('3', 'd'), ('4', 'e'), ('4', 'f'), ('5', 'g')]
但我希望将其格式化为这样,其中每个数字只有一个,并带有这些数字后面的字母列表,而不是它们全部分开:
list = [('1', ['a']), ('2', ['b']), ('3', ['c', 'd']), ('4', ['e', 'f']), ('5', ['g'])]
采取什么方法?
创建一个分组字典,其中键是元组中的第一个值,值是列表。然后你可以将这个字典转换为最终列表:
lst = [
("1", "a"),
("2", "b"),
("3", "c"),
("3", "d"),
("4", "e"),
("4", "f"),
("5", "g"),
]
out = {}
for a, b in lst:
out.setdefault(a, []).append(b)
out = list(out.items())
print(out)
打印:
[('1', ['a']), ('2', ['b']), ('3', ['c', 'd']), ('4', ['e', 'f']), ('5', ['g'])]
这是
itertools.groupby
完成的操作。一个简单的例子,假设你的列表已经正确排序,看起来像
>>> from itertools import groupby
>>> L = [('1', 'a'), ('2', 'b'), ('3', 'c'), ('3', 'd'), ('4', 'e'), ('4', 'f'), ('5', 'g')]
>>> [(k, [x for _, x in v]) for k, v in groupby(L, key=lambda x: x[0])]
[('1', ['a']), ('2', ['b']), ('3', ['c', 'd']), ('4', ['e', 'f']), ('5', ['g'])]
groupby
的结果是键(由key
参数定义)到共享每个键的列表中的对象的映射。 [x for _, x in v]
提取原始元组的非关键部分。