当我尝试通过列表理解来重新创建zip函数时,我正在练习本网站https://anandology.com/python-practice-book/working-with-data.html。 现在,我创建了此功能。但是没有得到列表,而是得到了一个生成器:-(
def zipp (liste1,liste2):
length= len(liste1)
zipped=[]
[zipped.append(tuple(liste1[i], liste2[i]) for i in range(length))]
return zipped
我在这里搜索了一下,发现了: Python: why does list comprehension produce a generator?
相应地,我已经使用了“元组”语句,但是没有醒来。
我不知道为什么即使插入了tuple()也能得到一个生成器。 所以我的问题:
谢谢。
edit:我期望的结果是其中包含每个列表成员的元组列表。这就是我应该得到的:
zipp([1、2、3],[“ a”,“ b”,“ c”]) -> [(1,“ a”),(2,“ b”),(3,“ c”)]
答案 0 :(得分:2)
您要在对象中放置生成器:
tuple(liste1[i], liste2[i]) for i in range(length)
(而且tuple
也不起作用,只需将其删除...。)
(并且不要将理解用于副作用)
最好的方法是使用列表理解来完全重写它,而列表理解应该实际上是返回,而列表理解应该以这两种长度的最小值来完全模拟zip
:
def zipp (liste1,liste2):
return [(liste1[i], liste2[i]) for i in range(min(len(liste1),len(liste2)))]
经典循环版本(无需理解)
def zipp (liste1,liste2):
result = []
for i in range(min(len(liste1),len(liste2))):
result.append((liste1[i], liste2[i]))
return result
当然,这不过是list(zip(liste1,liste2))
(在zip
上强制迭代)
答案 1 :(得分:1)
试图回答您的问题...
1.-为什么?
A:正如许多人提到的那样,您将zipped
作为列表生成器[zipped.append(tuple(liste1[i], liste2[i]) for i in range(length))]
中的列表生成器返回,这并不是一个好方法。这就是为什么要使用这些生成器。
2.-我需要更改什么,或者在哪里可以阅读/听到更多内容,以使自己成为“开明”的人?
A:如果您仍然希望这样做,则只需移动括号并删除元组函数,就可以附加这两项:
def zipp (liste1, liste2):
length = len(liste1)
zipped = []
[zipped.append( (liste1[i], liste2[i]) ) for i in range(length) ] # not the best way, but still works. This created list is never used.
return zipped
然后可以返回列表
zipp([1,2,3], ['a','b','c'])
请注意,这假定两个列表的长度相同。否则,您必须选择一个(就像您所做的一样)或找到两个长度的最小值(也可以选择最长的并填充所需的任何值):
min(len(liste1), len(liste2))
3.-如何使用生成器获取结果?
A:要使其成为生成器,您需要产生所需的值:
def zipp2 (liste1,liste2):
i = 0
minval = min(len(liste1), len(liste2))
while i< minval:
yield (liste1[i], liste2[i])
i += 1
# call the function generator
gen = zipp2([1,2,3], ['a','b','c'])
print(gen)
for p in gen:
print(p)
并获得结果...
<generator object zipp2 at 0x7fe46bef3db0>
(1, 'a')
(2, 'b')
(3, 'c')