python 中的 [iter(list)]*2 是什么意思?

use*_*805 5 python zip iterator

我在网上找到了下面的代码,结果是列表中两个元素的元组,如何理解[iter(list)]*2

lst = [1,2,3,4,5,6,7,8]
b=zip(*[iter(lst)]*2)
list(b)

[(1, 2), (3, 4), (5, 6), (7, 8)]

------------
[iter(lst)]*2
[<list_iterator at 0x1aff33917f0>, <list_iterator at 0x1aff33917f0>]
Run Code Online (Sandbox Code Playgroud)

我检查[iter(lst)]*2,与上面相同的迭代器,所以意味着iter重复双倍,所以,如果我检查从 2 到 3 的 num,结果应该是[(1, 2, 3), (4, 5, 6),(7,8,NaN)] 但删除 7,8

lst = [1,2,3,4,5,6,7,8]
b=zip(*[iter(lst)]*3)
list(b)
--------------
[(1, 2, 3), (4, 5, 6)]
Run Code Online (Sandbox Code Playgroud)

gel*_*ida 3

这是一个很难解释的结构。我来试试:

您可以[iter(lst)]创建一个包含一项的列表。该项目是列表上的迭代器。

每当 python 尝试从此迭代器获取元素时,就会返回下一个元素,lst直到没有更多元素可用。

只需尝试以下操作:

i = iter(lst)
next(i)
next(i)
Run Code Online (Sandbox Code Playgroud)

输出应如下所示:

>>> lst = [1,2,3,4,5,6,7,8]  
>>> i = iter(lst)
>>> next(i)
1
>>> next(i)
2
>>> next(i)
3
>>> next(i)
4
>>> next(i)
5
>>> next(i)
6
>>> next(i)
7
>>> next(i)
8
>>> next(i)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
Run Code Online (Sandbox Code Playgroud)

现在您创建一个包含两次完全相同的迭代器的列表。你这样做 itlst = [iter(lst)] * 2

尝试以下操作:

itlst1 = [iter(lst)] * 2
itlst2 = [iter(lst), iter(lst)]
print(itlst1)
print(itlst2)
Run Code Online (Sandbox Code Playgroud)

结果将类似于:

>>> itlst1 = [iter(lst)] * 2
>>> itlst2 = [iter(lst), iter(lst)]
>>> print(itlst1)
[<list_iterator object at 0x7f9251172b00>, <list_iterator object at 0x7f9251172b00>]
>>> print(itlst2)
[<list_iterator object at 0x7f9251172b70>, <list_iterator object at 0x7f9251172ba8>]
Run Code Online (Sandbox Code Playgroud)

值得注意的是,这itlst1是一个包含两次相同迭代器的列表,而itlst2包含两个不同的迭代器。

为了说明这一点,请尝试输入:

next(itlst1[0])
next(itlst1[1])
next(itlst1[0])
next(itlst1[1])
Run Code Online (Sandbox Code Playgroud)

并将其与:

next(itlst2[0])
next(itlst2[1])
next(itlst2[0])
next(itlst2[1])
Run Code Online (Sandbox Code Playgroud)

结果是:

>>> next(itlst1[0])
1
>>> next(itlst1[1])
2
>>> next(itlst1[0])
3
>>> next(itlst1[1])
4
>>> 
>>> next(itlst2[0])
1
>>> next(itlst2[1])
1
>>> next(itlst2[0])
2
>>> next(itlst2[1])
2
Run Code Online (Sandbox Code Playgroud)

现在到zip()函数(https://docs.python.org/3/library/functions.html#zip):

尝试以下操作:

i = iter(lst)
list(zip(i, i))
Run Code Online (Sandbox Code Playgroud)

zip()有两个参数。每当您尝试从中获取下一个元素时,zip都会执行以下操作:

  • 从可迭代对象中获取第一个参数的值
  • 从可迭代对象中获取一个值,即第二个参数
  • 返回包含这两个值的元组。

list(zip(xxx))将重复执行此操作并将结果存储在列表中。

结果将是:

>>> i = iter(lst)
>>> list(zip(i, i))
[(1, 2), (3, 4), (5, 6), (7, 8)]
Run Code Online (Sandbox Code Playgroud)

使用的下一个技巧是*使用第一个元素作为函数调用的第一个参数,第二个元素作为第二个参数,依此类推)**(双星/星号)和*(星号/星号)有什么作用对于参数做什么?

所以写:

itlst1 = [iter(lst)] * 2
list(zip(*itlst1))
Run Code Online (Sandbox Code Playgroud)

在这种情况下等同于

i = iter(lst)
itlst1 = [i] * 2
list(zip(itlst1[0], itlst1[1]))
Run Code Online (Sandbox Code Playgroud)

这与

list(zip(i, i))
Run Code Online (Sandbox Code Playgroud)

我已经解释过了。

希望这能解释上面的大部分技巧。