我有一个程序应该将函数应用于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中的项填充列表,而不运行该函数两次。
答案 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]}