Python 3 中的 operator.setitem 问题
我在使用Python 3中的operator.setitem时遇到了问题。
我用下面的代码在Python 3.1中运行。
people=(('fred','sam','jane','betty'),(1,2,3,4))
p_dict = {}
map(operator.setitem, [p_dict]*len(people[0]), people[0],people[1])
print (p_dict)
>>> {}
结果只是打印出一个空字典{}。
但是我用同样的代码在Python 2.6中运行时,结果是{'jane': 3, 'betty': 4, 'sam': 2, 'fred': 1}。
这是我想要的结果。
所以,有谁能告诉我在Python 3中运行这段代码时出了什么问题吗?谢谢!
3 个回答
1
在Python 3中,map
的结果是懒加载的,这可能会让你在调试时感到困惑,尤其是当你在旧版本的Python中一切都运行得很顺利的时候。换句话说,它实际上是一个生成器,所以你需要先“消费”它,才能把里面的内容放到你的字典里。
在这种情况下,你最好用一个for循环来处理:
people=(('fred','sam','jane','betty'),(1,2,3,4))
p_dict = {}
for key, value in zip(*people):
p_dict[key] = value
# Now p_dict is {'jane': 3, 'betty': 4, 'sam': 2, 'fred': 1}
或者用一个简单的字典构造函数:dict(zip(*people))
。
2
问题在于,map()这个函数从来没有“执行”。在Python 3中,map只是返回一个迭代器——这些元素只有在需要的时候才会被计算出来。为了绕过这个问题,你可以这样写:
list(map(operator.setitem, [p_dict]*len(people[0]), people[0],people[1]))
不过,我同意其他人的看法,其实你根本不应该使用map,因为你并不真正需要map应用的结果。
3
这是一种很不符合Python风格的方法。这样做要好得多(而且更高效):
people = (('fred','sam','jane','betty'), (1,2,3,4))
p_dict = dict(zip(*people))
在2.x和3.x版本上都能运行。