Python使用filter()函数和字典

3

所以我有这个字典

dic = { 0: [3,6,4], 1: [1,1,2], 2: [3,5,3], 3: [1,7,4], 4: [1,3,3], 5: [4,4,6] } 

我希望创建另一个字典,其中每个列表的sum()值都>10,使用filter()lambda表达式。

期望输出:{ 0: [3,6,4], 2: [3,5,3], 3: [1,7,4], 5: [4,4,6] }

我尝试了以下代码:

dict(filter(lambda e: sum(e[1]) > 10, dic.items()))

但它根本不起作用。

编辑:

好的,我刚解决了。

dict(filter(lambda e: sum(e[1][::]) > 10, dic.items()))

2
如果你解决了它,请将其发布为答案。 - xilpex
1
我认为sum(e[1])sum(e[1][::])没有任何区别。第二个只是对列表的一个副本求和,但结果是相同的。 - Barmar
1
你的原始代码实际上很好,只需要更改变量名即可。 - bherbruck
你们说得对,我没注意到我之前没有改变变量名,谢谢! - Sharki
3个回答

6

我认为使用字典推导式比使用dict(filter(...))更好:

>>> dic = { 0: [3,6,4], 1: [1,1,2], 2: [3,5,3], 3: [1,7,4], 4: [1,3,3], 5: [4,4,6] }
>>> {k: v for k, v in dic.items() if sum(v) > 10}
{0: [3, 6, 4], 2: [3, 5, 3], 3: [1, 7, 4], 5: [4, 4, 6]}

我喜欢使用推导式,但在这种情况下会更慢吗? - bherbruck
1
我同意,在colab上1000次迭代的差异大约是100ms(我昨天测试了这个确切的事情)。 - bherbruck
我不知道哪个更快,但事实上字典推导更容易,然而这个练习要求使用过滤器。:( - Sharki
@RoadRunner 天啊,那太酷了,可能是我的测试之间的协作资源不同。在几乎所有生产案例中,推导式可能是更好、更可读/Pythonic 的选项。 - bherbruck

2

您已经在正确的轨道上了!唯一的问题是您声明了一个变量名为dict,这个名称在Python中是保留的:

# changed name to data
data = { 0: [3,6,4], 1: [1,1,2], 2: [3,5,3], 3: [1,7,4], 4: [1,3,3], 5: [4,4,6] }

dict(filter(lambda e: sum(e[1]) > 10, data.items()))

输出:

{0: [3, 6, 4], 2: [3, 5, 3], 3: [1, 7, 4], 5: [4, 4, 6]}

看起来不错!

为了避免使用函数/对象名称作为变量名,我使用下划线。所以,你可以使用person_dict = {...}代替dict = {...}


变量名是 dic 而不是 dict - Barmar
1
不是我复制的,可能自那时起已经被编辑过了。 - bherbruck

1
你可以使用筛选器和lambda表达式来实现正确的输出。
dic = { 0: [3,6,4], 1: [1,1,2], 2: [3,5,3], 3: [1,7,4], 4: [1,3,3], 5: [4,4,6] }
threshold = 10
filtered_dic = dict(filter(lambda l: sum(l[1]) > threshold, dic.items()))
print(filtered_dic)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接