我在网上找到了下面的代码,结果是列表中两个元素的元组,如何理解[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)]*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)]发布于 2020-05-08 02:48:36
一个很难解释的结构。我试试看:
使用[iter(lst)],您可以创建一个带有一个项的列表。项是列表上的迭代器。
每当python试图从这个迭代器获得一个元素时,就会返回lst的下一个元素,直到没有更多的元素可用为止。
试着做以下几个方面:
i = iter(lst)
next(i)
next(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现在,创建一个包含两次的列表--完全相同的迭代器。你用itlst = [iter(lst)] * 2做这件事
试一试如下:
itlst1 = [iter(lst)] * 2
itlst2 = [iter(lst), iter(lst)]
print(itlst1)
print(itlst2)其结果将类似于:
>>> 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>]需要注意的是,itlst1是一个包含两倍相同迭代器的列表,而itlst2包含两个不同的迭代器。
为了举例说明,请尝试键入:
next(itlst1[0])
next(itlst1[1])
next(itlst1[0])
next(itlst1[1])并将其与以下方面进行比较:
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()函数( https://docs.python.org/3/library/functions.html#zip ):
尝试以下几个方面:
i = iter(lst)
list(zip(i, i))具有两个参数的zip()。当您尝试从zip获取下一个元素时,它将执行以下操作:
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], itlst1[1]))它与
list(zip(i, i))我已经解释过了。
希望这解释了上面的大部分技巧。
发布于 2020-05-08 02:32:39
iter(lst)将列表转换为迭代器。迭代器允许您通过调用next()懒洋洋地执行迭代,直到迭代器用完项为止。
[iter(lst)]将迭代器放入单个元素列表中。
[iter(lst)] * 2在列表中复制了两个迭代器,给出了
it = iter(lst)
[it, it] 两个list元素都是同一个基础迭代器对象的别名,因此每当在任何一个迭代器上调用next()时,当zip耗尽它们时,都会产生连续的元素。
*[...]将相同迭代器的两个副本的列表解压缩到zip的参数中。这将创建一个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对象第一次尝试在任何一个参数迭代上生成一个None结果时,它就会停止,而不会生成一个元组。您可以使用itertools.zip_longest来匹配您的预期行为,大致如下:
>>> list(zip_longest(*[iter(lst)] * 3))
[(1, 2, 3), (4, 5, 6), (7, 8, None)]如果意外地反映在子列表中的列表更改的混叠行为令人惊讶,请参见规范答案[...] * 2。
https://stackoverflow.com/questions/61670945
复制相似问题