[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
等的输出?解释得很好!