Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
[iter(list)]*2在python中的含义是什么?_Python_Iterator_Zip - Fatal编程技术网

[iter(list)]*2在python中的含义是什么?

[iter(list)]*2在python中的含义是什么?,python,iterator,zip,Python,Iterator,Zip,我在网上找到了下面的代码,结果是列表中两个元素的元组,如何理解[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>] iter(l

我在网上找到了下面的代码,结果是列表中两个元素的元组,如何理解
[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>]
iter(lst)
。迭代器允许您通过调用直到迭代器的项用完为止,缓慢地逐步遍历iterable

[iter(lst)]
将迭代器放入单个元素列表中

[iter(lst)]*2
制作列表中迭代器的两个副本,给出

it = iter(lst)
[it, it] 
这两个列表元素都是同一个底层迭代器对象的别名,因此只要在
zip
耗尽迭代器时对其中一个迭代器调用
next()
,就会生成连续的元素

*[…]
将同一迭代器的两个副本的列表解压缩到的参数中。这将创建一个zip对象,让您可以迭代每个参数的元素元组

list(…)
遍历zip对象并将元素复制到列表中。由于两个压缩迭代器都指向同一个底层迭代器,因此我们可以在输出中看到顺序元素

如果不使用迭代器别名,您将获得

>>> list(zip(iter(lst), iter(lst)))
[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8)]
编写
list(zip(*[iter(lst)]*2))
的一种类似方法是
list(zip(lst[::2],lst[1::2])
,这似乎没有那么神奇(如果性能差得多的话)

解释

>>> list(zip(*[iter(lst)] * 3))
[(1, 2, 3), (4, 5, 6)]
省略元素是指当zip对象第一次尝试对任何参数iterables产生
None
结果时,它停止并不生成元组。您可以使用来或多或少地匹配您的预期行为:

>>> list(zip_longest(*[iter(lst)] * 3))
[(1, 2, 3), (4, 5, 6), (7, 8, None)]

如果
[…]*2
别名行为令人惊讶,请查看规范答案。

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

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

每当python试图从这个迭代器中获取元素时,就会返回
lst
的下一个元素,直到没有更多的元素可用为止

请尝试以下内容:

i = iter(lst)
next(i)
next(i)
itlst1 = [iter(lst)] * 2
itlst2 = [iter(lst), iter(lst)]
print(itlst1)
print(itlst2)
i = iter(lst)
list(zip(i, i))
输出应该如下所示:

>>> 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
结果将类似于:

>>> 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>]
并将其与:

next(itlst2[0])
next(itlst2[1])
next(itlst2[0])
next(itlst2[1])
结果是:

>>> 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
现在转到
zip()
函数():

请尝试以下操作:

i = iter(lst)
next(i)
next(i)
itlst1 = [iter(lst)] * 2
itlst2 = [iter(lst), iter(lst)]
print(itlst1)
print(itlst2)
i = iter(lst)
list(zip(i, i))
zip()
带有两个参数。 当您尝试从
zip
获取下一个元素时,它将执行以下操作:

i = iter(lst)
next(i)
next(i)
itlst1 = [iter(lst)] * 2
itlst2 = [iter(lst), iter(lst)]
print(itlst1)
print(itlst2)
i = iter(lst)
list(zip(i, i))
  • 从第一个参数iterable中获取一个值
  • 从第二个参数iterable中获取一个值
  • 返回包含这两个值的元组
list(zip(xxx))
将重复执行此操作,并将结果存储在列表中

结果将是:

>>> i = iter(lst)
>>> list(zip(i, i))
[(1, 2), (3, 4), (5, 6), (7, 8)]
使用的下一个技巧是
*
,用于将第一个元素用作函数调用的第一个参数,将第二个元素用作第二个参数,依此类推)

这样写:

itlst1 = [iter(lst)] * 2
list(zip(*itlst1))
在这种情况下与

i = iter(lst)
itlst1 = [i] * 2
list(zip(itlst1[0], itlst[1]))
list(zip(i, i))
这和

i = iter(lst)
itlst1 = [i] * 2
list(zip(itlst1[0], itlst[1]))
list(zip(i, i))
我已经解释过了


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

您尝试了哪些技巧,哪些具体部分让您感到困惑?您是否检查了每个步骤的输出?与检查
[iter(lst)]
的输出一样,然后检查
[iter(lst)]*2
等的输出?解释得很好!