鱼C论坛

 找回密码
 立即注册
查看: 1872|回复: 12

[已解决]关于zip创建字典的疑问

[复制链接]
发表于 2021-9-16 08:59:49 | 显示全部楼层 |阅读模式
3鱼币
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迭代一遍,把他掏空了就不行了

最佳答案

查看完整内容

这样是可以的 zip是个迭代器 你前面用for迭代一遍,把他掏空了就不行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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迭代一遍,把他掏空了就不行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-16 09:54:33 | 显示全部楼层
逃兵 发表于 2021-9-16 08:59
这样是可以的
zip是个迭代器
你前面用for迭代一遍,把他掏空了就不行了

我运行了一下,是可以的,我估计可能和我在shell中的操作有关吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-16 09:55:22 | 显示全部楼层
@小甲鱼 为啥【逃兵】这个答案我自己没碰就是莫名被被人给出了“”“最佳答案”呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-16 09:55:30 | 显示全部楼层
In [1]: 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'], [1, 2])
print(z)
print(z.__class__.mro()) 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

如此说来,还是语言设计的考虑咯。zip让我总感觉怪怪的,哈哈,谢谢回答、!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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)
这样就不行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

版主设定的最佳
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-16 10:02:38 | 显示全部楼层
逃兵 发表于 2021-9-16 10:01
和你在shell中运行没有关系
是因为你通过for循环遍历了

我草 还可以这样??哥,快说说,为啥遍历了就不行了 !!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-16 10:03:19 | 显示全部楼层
逃兵 发表于 2021-9-16 10:01
版主设定的最佳

好快啊,手太快了,我的天,一般不是7天,吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

比较典型的结构是iter 和zip
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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
{}

你解释的很形象,谢谢!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-17 08:21:33 | 显示全部楼层
@冬雪学冬 我的问题帖子刚发才不到一个小时,我人还在呢,没有超过七天的,你这么快给我设置最佳我怎么能更多地多获得吧友的帮助呢?太不负责了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 09:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表