Python初学者8号 发表于 2021-9-16 08:59:49

关于zip创建字典的疑问

dict()可以创建字典我知道,二维的列表、元组,字典,以及带等号的方法我都知道。只是我在研究使用zip的时候发现了这个问题:
>>> z1=('we','will','rock','you')
>>> z2 = (1,2,3,4)
>>> z3 = zip(z1,z2)
>>> z3
<zip object at 0x000001C1F339E400>
>>> for i in z3:
    print (i)
   
('we', 1)
('will', 2)
('rock', 3)
('you', 4)
>>> d = dict(z3)
>>> d
{}而正确的答案应该是这个
>>> d = dict(zip(z1,z2))
>>> d
{'we': 1, 'will': 2, 'rock': 3, 'you': 4}
请问这个是为啥?是和zip的数据结构有关吗?
ps:我也很纳闷,zip已经很像字典了为何还不能像是字典一样显示出来

逃兵 发表于 2021-9-16 08:59:50

z1=('we','will','rock','you')
z2 = (1,2,3,4)
z3 = zip(z1,z2)
d = dict(z3)


这样是可以的
zip是个迭代器
你前面用for迭代一遍,把他掏空了就不行了

Python初学者8号 发表于 2021-9-16 09:54:33

逃兵 发表于 2021-9-16 08:59
这样是可以的
zip是个迭代器
你前面用for迭代一遍,把他掏空了就不行了

我运行了一下,是可以的,我估计可能和我在shell中的操作有关吧

Python初学者8号 发表于 2021-9-16 09:55:22

@小甲鱼 为啥【逃兵】这个答案我自己没碰就是莫名被被人给出了“”“最佳答案”呢?

阿奇_o 发表于 2021-9-16 09:55:30

In : zip?
Init signature: zip(self, /, *args, **kwargs)
Docstring:
zip(*iterables) --> zip object

Return a zip object whose .__next__() method returns a tuple where
the i-th element comes from the i-th iterable argument.The .__next__()
method continues until the shortest iterable in the argument sequence
is exhausted and then it raises StopIteration.


哈哈,你要想它像字典那样显示也没问题,自己继承 zip 类,改写一下就行了,比如这样:
class myZip(zip):
    def __str__(self):
      return str(dict(self))

z = myZip(['a','b'], )
print(z)
print(z.__class__.mro())

Python初学者8号 发表于 2021-9-16 09:58:45

阿奇_o 发表于 2021-9-16 09:55
哈哈,你要想它像字典那样显示也没问题,自己继承 zip 类,改写一下就行了,比如这样:

如此说来,还是语言设计的考虑咯。zip让我总感觉怪怪的,哈哈,谢谢回答、!!{:5_109:}

逃兵 发表于 2021-9-16 10:01:11

Python初学者8号 发表于 2021-9-16 09:54
我运行了一下,是可以的,我估计可能和我在shell中的操作有关吧

和你在shell中运行没有关系
是因为你通过for循环遍历了
z1=('we','will','rock','you')
z2 = (1,2,3,4)
z3 = zip(z1,z2)
for i in z3:
    print(i)
d = dict(z3)

这样就不行了

逃兵 发表于 2021-9-16 10:01:41

Python初学者8号 发表于 2021-9-16 09:55
@小甲鱼 为啥【逃兵】这个答案我自己没碰就是莫名被被人给出了“”“最佳答案”呢?

版主设定的最佳

Python初学者8号 发表于 2021-9-16 10:02:38

逃兵 发表于 2021-9-16 10:01
和你在shell中运行没有关系
是因为你通过for循环遍历了



我草 还可以这样??哥,快说说,为啥遍历了就不行了 !!!{:5_100:}

Python初学者8号 发表于 2021-9-16 10:03:19

逃兵 发表于 2021-9-16 10:01
版主设定的最佳

好快啊,手太快了,我的天,一般不是7天,吗{:5_90:}

逃兵 发表于 2021-9-16 10:10:11

Python初学者8号 发表于 2021-9-16 10:02
我草 还可以这样??哥,快说说,为啥遍历了就不行了 !!!

迭代器就像枪里的子弹
按照你上膛的顺序(有序)
打一发少一发(有量)
你的for循环像是机关枪,打完了所有子弹
一把空枪,再也取不出子弹

比较典型的结构是iter 和zip

Python初学者8号 发表于 2021-9-16 10:21:41

逃兵 发表于 2021-9-16 10:10
迭代器就像枪里的子弹
按照你上膛的顺序(有序)
打一发少一发(有量)


>>> z1=('we','will','rock','you')
>>> z2 = (1,2,3,4)
>>> z3 = zip(z1,z2)
>>> d = dict(z3)
>>> d
{'we': 1, 'will': 2, 'rock': 3, 'you': 4}
>>> for i in z3:
    print(i)
   
>>> d
{'we': 1, 'will': 2, 'rock': 3, 'you': 4}
>>> e = dict(z3)
>>> e
{}

你解释的很形象,谢谢!!

Python初学者8号 发表于 2021-9-17 08:21:33

@冬雪学冬 我的问题帖子刚发才不到一个小时,我人还在呢,没有超过七天的,你这么快给我设置最佳我怎么能更多地多获得吧友的帮助呢?太不负责了吧
页: [1]
查看完整版本: 关于zip创建字典的疑问