元组的列表理解为我提供了一个生成器-为什么以及如何进行修改?

时间:2018-11-21 16:53:22

标签: python generator list-comprehension

当我尝试通过列表理解来重新创建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()也能得到一个生成器。 所以我的问题:

  1. 为什么?
  2. 我需要更改什么,或者在哪里可以阅读/听到更多内容,以使自己成为“开明”的人?
  3. 如何使用生成器获取结果? (或者我在哪里可以读到?)

谢谢。

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

zipp([1、2、3],[“ a”,“ b”,“ c”]) -> [(1,“ a”),(2,“ b”),(3,“ c”)]

2 个答案:

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