Python相当于Scala groupby

时间:2015-09-25 19:47:05

标签: python scala

我有一个对象列表,我想要一个可以接受该列表的函数以及对该列表中的项目进行操作的函数,并根据将该函数应用于该项目的结果生成一个带有键的dict ,和值是具有该键的项目列表。

示例:

def group_by(iterable: Iterable[A], f: Callable[A, B]) -> Dict[B, List[A]]:
    ???

lst = [(1,2), (3,4), (1,3)]
result = group_by(lst, lambda i: i[0])
result == {1: [(1,2), (1,3)],
           3: [(3,4)]}

itertools.groupby已接近,但我不想要求对我的输入进行排序。

2 个答案:

答案 0 :(得分:2)

以下是defaultdict的方法:

from collections import defaultdict
def group_by(iterable, f):
    results = defaultdict(list)
    for x in iterable:
        results[f(x)].append(x)
    return results

答案 1 :(得分:0)

您正在寻找itertools.groupby

from itertools import groupby
groups = []
uniquekeys = []
data = sorted(data, key=keyfunc)
for k, g in groupby(data, keyfunc):
    # watch out! g is an iterator here, you must iterate it
    groups.append(list(g))      # Store group iterator as a list
    uniquekeys.append(k)

def my_groupby(fn,datum):
    d = {}
    for data in datum:
        d.setdefault(fn(d),[]).append(data)
    return d