在Python中过滤操作

时间:2013-08-14 18:08:42

标签: python python-2.7 map reduce

我正在寻找一种在没有太多锅炉板代码的情况下在Python中执行此操作的方法。

假设我有一个清单:

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

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

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

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

4 个答案:

答案 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)))]