我有一个对象列表,我想要一个可以接受该列表的函数以及对该列表中的项目进行操作的函数,并根据将该函数应用于该项目的结果生成一个带有键的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
已接近,但我不想要求对我的输入进行排序。
答案 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