白白白白丶白 发表于 2020-7-6 17:04:52

zip函数相关问题

n =
ABC = ['A', 'B', 'C']
abc = 'abc'
z = zip(n, ABC, abc)
list(z) #输出[(1, 'A', 'a'), (2, 'B', 'b'), (3, 'C', 'c')]
z = zip(n, ABC, abc)
dict(z)#报错



执行完上面代码,再执行list(z)。输入的结果就是[(2, 'B', 'b'), (3, 'C', 'c')]。
请问 dict对z做了啥操作?

Twilight6 发表于 2020-7-6 17:08:23

本帖最后由 Twilight6 于 2020-7-6 17:10 编辑




字典是 key:value 的典型 键值对数据类型 ,而我们平时设置字典可以通过元组进行键值对应

而元组必须是两个元素,超过两个就会报错,因为元组的第一个元素代表字典的 key 第二个元素是 value

比如:
>>> dict([('a':1),('b',1)])
{'a':1,'b':1}

而你一个元组内超过了两个元素,导致dict 不懂到底哪个是值,哪个是键,所以报错了

白白白白丶白 发表于 2020-7-6 17:11:05

本帖最后由 白白白白丶白 于 2020-7-6 17:12 编辑

Twilight6 发表于 2020-7-6 17:08
字典是 key:value 的典型 键值对数据类型 ,而我们平时设置字典可以通过元组进行键值对应

而元组 ...

我知道为什么报错了, 我好奇为什么再次执行list(z),结果变成列表内两个元组了

Twilight6 发表于 2020-7-6 17:15:42

白白白白丶白 发表于 2020-7-6 17:11
我知道为什么报错了, 我好奇为什么再次执行list(z),结果变成列表内两个元组了



zip 函数就是将你填入的可迭代对象对应位置的元素进行打包为元组操作,返回的是一个 zip 对象,对这个 zip 对象 list 之后 肯定是一个列表了,你也可以 tuple 变成元组


白白白白丶白 发表于 2020-7-6 17:21:31

本帖最后由 白白白白丶白 于 2020-7-6 17:23 编辑

Twilight6 发表于 2020-7-6 17:15
zip 函数就是将你填入的可迭代对象对应位置的元素进行打包为元组操作,返回的是一个 zip 对象,对这 ...

n =
ABC = ['A', 'B', 'C']
abc = 'abc'
z = zip(n, ABC, abc)
list(z) #输出[(1, 'A', 'a'), (2, 'B', 'b'), (3, 'C', 'c')]
z = zip(n, ABC, abc)
dict(z)#报错
list(z)
[('B', 'b', 2), ('C', 'c', 3)]

你看上面加粗的代码,同样的list(z),执行的结果却是不一样的,就是因为中间尝试将z转换成字典,为什么再次执行list(z)列表里会少了(1, 'A', 'a')

Twilight6 发表于 2020-7-6 17:27:42

本帖最后由 Twilight6 于 2020-7-6 17:30 编辑

白白白白丶白 发表于 2020-7-6 17:21
你看上面加粗的代码,同样的list(z),执行的结果却是不一样的,就是因为中间尝试将z转换成字典,为 ...



这是因为zip 函数是返回 zip对象,而 zip 对象是个迭代器

当你 dict 时候对 z 进行转化 ,第一次肯定是先转化 (1, 'A', 'a') , 但是此时转化失败,因为 不能构成键值对

此时迭代器 z 已经被消耗掉一次了 , 剩下的 还有 ('B', 'b', 2), ('C', 'c', 3),所以你后面一次打印的 list 是将迭代器中剩下的转化为了 列表

你可以试着这样的代码:
n =
ABC = ['A', 'B', 'C']
abc = 'abc'
z = zip(n, ABC, abc)
print(next(z))   # 先消耗一次迭代器的值
print(list(z))   # 然后将迭代器里面的值全部转为列表

发现返回结果为:
(1, 'A', 'a')
[(2, 'B', 'b'), (3, 'C', 'c')]


白白白白丶白 发表于 2020-7-6 17:31:07

Twilight6 发表于 2020-7-6 17:27
这是因为zip 函数是返回 zip对象,而 zip 对象是个迭代器

当你 dict 时候对 z 进行转化 ,第一 ...

原来如此
页: [1]
查看完整版本: zip函数相关问题