我正在寻找一种在 Python 中执行此操作而无需太多样板代码的方法。
假设我有一个列表:
[(a,4),(b,4),(a,5),(b,3)]
我正在尝试找到一个允许我按第一个元组值排序的函数,并将列表值合并在一起,如下所示:
[(a,[4,3]),(b,[4,5])]
我知道我可以以天真的方式做到这一点,但我想知道是否有更好的方法。
我正在寻找一种在 Python 中执行此操作而无需太多样板代码的方法。
假设我有一个列表:
[(a,4),(b,4),(a,5),(b,3)]
我正在尝试找到一个允许我按第一个元组值排序的函数,并将列表值合并在一起,如下所示:
[(a,[4,3]),(b,[4,5])]
我知道我可以以天真的方式做到这一点,但我想知道是否有更好的方法。
使用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)
复杂性;group by 算法具有O(n * log(n))
并且 set/list/dict 理解具有大于O(n^2)
假设“a”是您的初始列表,“b”是预期结果,以下代码将起作用:
d = {}
for k, v in a:
if k in d:
d[k].append(v)
else:
d[k] = [v]
b = d.items()
效率不高,但足够了(使用 set + list + dict 理解):
>>> 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])]
另一种选择(再次假设'a'是初始列表)
[(key,[v2 for k2, v2 in a if k2 == key ]) for key in list(set(map(lambda x: x[0], a)))]