2015-09-25 48 views
1

我有一个对象列表,我想要一个函数,可以将该列表与一个函数操作该列表中的项目,并产生一个字典与应用的结果键该函数对该项目起作用,值是该项目的列表。python相当于斯卡拉groupby

例子:

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是接近的,但我不想要求我输入进行排序。

回答

1

下面是与defaultdict的方法:

from collections import defaultdict 
def group_by(iterable, f): 
    results = defaultdict(list) 
    for x in iterable: 
     results[f(x)].append(x) 
    return results 
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 
+0

'itertools.groupby'要求我输入进行排序 - 斯卡拉功能不,我不要我不想让这些数据成为需求。 – Daenyth

+0

值得注意的是,'itertools.groupby'只将具有相同键的连续元素分组,所以你必须首先对列表进行排序。 – BrenBarn

+0

@Daenyth:然后你可以在你的分组功能中自己排序。 – BrenBarn