元组的列表理解让我明白了为什么以及如何修改



我正在进行这个网站的练习https://anandology.com/python-practice-book/working-with-data.html当我试图通过列表理解来重新创建zip函数时。现在我创建了这个函数。但我没有得到一个列表,而是得到了一个生成器:-(

def zipp (liste1,liste2):
length= len(liste1)
zipped=[]
[zipped.append(tuple(liste1[i], liste2[i]) for i in range(length))]
return zipped

我在这里搜索了一下,发现了这个:Python:为什么列表理解生成生成器?

因此,我已经使用了"tuple"语句,但没有效果。

我不知道为什么我会得到一个生成器,即使插入了元组((。所以我的问题是:

  1. 为什么
  2. 我需要改变什么,或者在哪里可以阅读/听到更多内容来"开悟"自己
  3. 我如何使用生成器来获得结果?(或者我在哪里可以读到这方面的信息?(

谢谢。

编辑:我期望的结果是元组的列表,其中每个列表的成员。这就是我应该得到的:

zipp([1,2,3],["a","b","c"](->[(1,"a"(,(2,"b"(,[(3,"c"(]

您正在将生成器放入对象中:

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.-为什么?

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:要使其成为生成器,您需要生成nedeed值:

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')

最新更新