根据可迭代项附加到 defaultdict(list)

Append to defaultdict(list) based upon items in an iterable

我有一个程序应该将一个函数应用于一个可迭代对象并且 return 一个字典(列表),其中键是函数的值,列表中的值是从函数产生值的项目。

代码:

from collections import defaultdict


numbers = [1, 4, 5, 6, 8, 19, 34, 55]
d = defaultdict(list)


def modn(n):
    return n % 3


def group_by_value(it, func):
    result = map(func, it)

    for i in result:
        for j in it:
            d[i].append(j)

    return d


print(group_by_value(numbers, modn))

我得到: {1: [1, 4, 5, 6, 8, 19, 34, 55, 1, 4, 5, 6, 8, 19, 34, 55, 1, 4, 5, 6, 8, 19, 34, 55, 1, 4, 5, 6, 8, 19, 34, 55, 1, 4, 5, 6, 8, 19, 34, 55], 2: [1, 4, 5, 6, 8, 19, 34, 55, 1, 4, 5, 6, 8, 19, 34, 55], 0: [1, 4, 5, 6, 8, 19, 34, 55]}

我应该得到:

{0: [6], 1: [1, 4, 19, 34, 55], 2: [5, 8]}

我明白为什么我会得到错误的结果。但是,我一直想 运行 modn() 函数两次:一次获取结果,一次进行比较以查看数字中的项目是否已经存在。我忍不住想我不应该 运行 该函数两次,但我被卡住了。

我应该能够将该函数应用于可迭代对象中的每个项目,获取 return 值,然后使用产生该值的可迭代对象中的项目填充列表,而无需 运行调用函数两次。

逻辑分解步骤:

1.Get 函数的结果值

2.Build 一个字典,其中键是结果值,值是 []

3.For 'it' 中的每个值,将其附加到字典中具有其结果值的键

def group_by_value(it, func):
    result = list(map(func, it))
    d = {i:[] for i in result}
    for i in range(len(it)):
        d[result[i]].append(it[i])

    return d

group_by_value(numbers, modn)
>>>{1: [1, 4, 19, 34, 55], 2: [5, 8], 0: [6]}