2015-09-25 96 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