根据iterable中的项追加到defaultdict(list)

时间:2018-04-17 22:39:32

标签: python-3.6 defaultdict

我有一个程序应该将函数应用于iterable并返回 一个字典(列表),其中键是函数中的值,列表中的值是从函数中生成值的项。

代码:

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()函数:一次得到结果,一次做比较,看看数字中的项目是否已经存在。我无能为力,但我认为我不应该两次运行该功能,但我被困住了。

我应该能够将函数应用于iterable中的每个项目,获取返回值,然后使用产生值的iterable中的项填充列表,而不运行该函数两次。

1 个答案:

答案 0 :(得分:0)

逻辑上分解步骤:

1.从函数

获取结果值

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

3.对于'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]}