我正在寻找一种在没有太多锅炉板代码的情况下在Python中执行此操作的方法。
假设我有一个清单:
[(a,4),(b,4),(a,5),(b,3)]
我试图找到一个允许我按第一个元组值排序的函数,并将列表值合并在一起,如下所示:
[(a,[4,3]),(b,[4,5])]
我知道我可以用天真的方式做到这一点,但我想知道是否有更好的方法。
答案 0 :(得分:2)
使用collections.defaultdict(list)
:
from collections import defaultdict
lst = [("a",4), ("b",4), ("a",5), ("b",3)]
result = defaultdict(list)
for a, b in lst:
result[a].append(b)
print sorted(result.items())
# prints: [('a', [4, 5]), ('b', [4, 3])]
在排序之前,算法具有O(n)
复杂度;算法分组O(n * log(n))
,而set / list / dict理解大于O(n^2)
答案 1 :(得分:0)
假设'a'是您的初始列表,'b'是预期结果,以下代码将起作用:
d = {}
for k, v in a:
if k in d:
d[k].append(v)
else:
d[k] = [v]
b = d.items()
答案 2 :(得分:0)
效率不高,但足够(使用set + list + dict comprehension):
>>> data = [("a",4), ("b",4), ("a",5), ("b",3)]
>>> {key: [v for k, v in data if k == key]
... for key in {k for k, v in data}
... }.items()
[('a', [4, 5]), ('b', [4, 3])]
答案 3 :(得分:0)
另一种选择(再次假设'a'是初始列表)
[(key,[v2 for k2, v2 in a if k2 == key ]) for key in list(set(map(lambda x: x[0], a)))]