python - 关于使用 setitem 的地图功能的建议
问题描述
我正在努力理解“Python Book”中的脚本。该脚本通过将每个元素作为键(例如'none'
作为值)放入字典中来从列表中删除重复项,然后返回dict.keys()
. 脚本如下:
from operator import setitem
def distinct(l):
d = {}
map(setitem, (d,)*len(l), l, [])
return d.keys()
我已经运行了脚本,将包含重复项的列表传递给distinct()
:
li = [1, 5, 6, 1, 8]
x = distinct(li)
print(x)
但是,当我运行脚本并打印结果时,我得到了:
dict_keys([])
有人可以给我一个如何运行该distinct()
函数的示例,以便获得一些有意义的输出吗?也请有人解释一下 map 函数如何与内部setitem
函数一起工作。我已经阅读过setitem
,但我不确定它是如何在这里工作的。我对第一个论点感到困惑setitem
:
(d,)*len(l)
解决方案
正如所写的那样,distinct
不能在 Python 3 中工作,因为在这种情况下,map
一个类setitem
返回一个可迭代的对象,该可迭代对象将在您对其进行迭代时按需调用。由于返回值被忽略,setitem
永远不会被调用。
在 Python 2 中,map
有一个函数的行为很像列表推导:它通过调用setitem
给定迭代的元素返回一个返回值列表。map
但是,仅仅为了函数的副作用而使用(或列表理解)从未被认为是好的做法。
如果您不关心生成的序列或列表,请使用适当的for
循环,而不是创建map
永远不会迭代的实例。
def distinct(l):
d = {}
for k in l:
d[k] = None
return list(d)
或使用 dict 理解:
def distinct(l):
return list({k: None for k in l})
的目的(d,)*len(l)
是创建引用序列d
,以便每次调用都setitem
修改相同dict
。
调整我的第一个示例以使用setitem
看起来像
def distinct(l):
d = {}
for k in l:
setitem(d, k, None)
return list(d)
请注意,list(map(setitem, (d,)*len(l), l, []))
永远不会做任何事情。[]
是第三个可迭代对象,其内容,而不是列表本身,将用作 . 的第三个参数setitem
。map
仅迭代直到用尽最短的可迭代对象,并且空列表将立即用尽。
推荐阅读
- asp.net - Azure 服务器上的 Web 套接字连接失败
- spartacus-storefront - Spartacus 4.0.0 - “OutletPosition”类型上不存在“BEFORE”属性
- reactjs - Spring Cloud Gateway Webflux Okta
- mysql - 创建的模型未显示在 Django Atomic Trasaction 块中
- google-colaboratory - Google Colab yolov3 暗网停止从“插入暗网目录”加载权重完成!学习率:0.001,动量:0.9,衰减:0.0005
- python - 为什么交叉函数没有显示正确的结果?
- javascript - 将全局状态添加到我的 VueJS 应用程序
- android - Flutter 如何将一行中具有相同列的数据获取到卡片中?
- unity3d - Unity 如何记住特定的游戏对象
- javascript - 在 JS 中执行完另一个异步函数后,如何执行异步函数?