2

我正在寻找一种在 Python 中执行此操作而无需太多样板代码的方法。

假设我有一个列表:

[(a,4),(b,4),(a,5),(b,3)]

我正在尝试找到一个允许我按第一个元组值排序的函数,并将列表值合并在一起,如下所示:

[(a,[4,3]),(b,[4,5])]

我知道我可以以天真的方式做到这一点,但我想知道是否有更好的方法。

4

4 回答 4

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)复杂性;group by 算法具有O(n * log(n))并且 set/list/dict 理解具有大于O(n^2)

于 2013-08-14T18:12:24.040 回答
0

假设“a”是您的初始列表,“b”是预期结果,以下代码将起作用:

d = {}
for k, v in a:
    if k in d:
        d[k].append(v)
    else:
        d[k] = [v] 
b = d.items()
于 2013-08-14T18:20:12.690 回答
0

效率不高,但足够了(使用 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])]
于 2013-08-14T18:25:00.297 回答
0

另一种选择(再次假设'a'是初始列表)

[(key,[v2 for k2, v2 in a if k2 == key ]) for key in list(set(map(lambda x: x[0], a)))]
于 2013-08-14T18:49:30.547 回答