python中[iter(list)] * 2的含义是什么?
- 作者: 丿此般幸福75695311
- 来源: 51数据库
- 2022-10-28
问题描述
我在网上找到了下面的代码,结果是列表中两个元素的元组,如何理解[iter(list)]*2?
I have found below code in web, result is tuple of two elements in list, how to understand [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 重复双倍,所以,如果我检查 num 从 2 到 3,结果应该是 [(1, 2, 3), (4, 5, 6),(7,8,NaN)]但删除 7,8
I check [iter(lst)]*2, same iterator above, so meaning iter repeat double, so, if i check num from 2 to 3, result should be [(1, 2, 3), (4, 5, 6),(7,8,NaN)] but delete 7,8
lst = [1,2,3,4,5,6,7,8] b=zip(*[iter(lst)]*3) list(b) -------------- [(1, 2, 3), (4, 5, 6)]
推荐答案
解释起来相当棘手.我试一试:
Quite a tricky construct to explain. I'll give it a shot:
使用 [iter(lst)] 您可以创建一个包含一个项目的列表.该项目是列表的迭代器.
with [iter(lst)] you create a list with with one item. The item is an iterator over a list.
每当 python 试图从这个迭代器中获取一个元素时,就会返回 lst 的下一个元素,直到没有更多元素可用为止.
whenever python tries to get an element from this iterator, then the next element of lst is returned until no more element is available.
请尝试以下操作:
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
Now you create a list that contains twice exactly the same iterator. You do this with 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 包含两个不同的迭代器.
What is important to notice is, that itlst1 is a list containing twice the same iterator, whereas itlst2 contains two different iterators.
为了说明尝试输入:
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() 函数( http://www.51sjk.com/Upload/Articles/1/0/335/335017_20221028120445438.html#zip):
Now to the zip() function ( http://www.51sjk.com/Upload/Articles/1/0/335/335017_20221028120445438.html#zip ):
尝试以下操作:
i = iter(lst) list(zip(i, i))
zip() 有两个参数.当您尝试从 zip 获取下一个元素时,它将执行以下操作:
zip() with two parameters. Whenver you try to get the next element from zip it will do following:
- 从作为第一个参数的可迭代对象中获取一个值
- 从可迭代的第二个参数中获取一个值
- 返回一个包含这两个值的元组.
list(zip(xxx)) 将重复执行此操作并将结果存储在列表中.
list(zip(xxx)) will do this repeatedly and store the result in a list.
结果将是:
>>> i = iter(lst) >>> list(zip(i, i)) [(1, 2), (3, 4), (5, 6), (7, 8)]
使用的下一个技巧是 *,用于将第一个元素用作函数调用的第一个参数,将第二个元素用作第二个参数,依此类推)什么是**(双星/星号)和*(星号/星号)) 为参数做些什么?
The next trick being used is the * that is used to use the first element as first parameter to a function call, the second element as second parameter and so forth) What does ** (double star/asterisk) and * (star/asterisk) do for parameters?
这么写:
itlst1 = [iter(lst)] * 2 list(zip(*itlst1))
在这种情况下与
i = iter(lst) itlst1 = [i] * 2 list(zip(itlst1[0], itlst1[1]))
与
list(zip(i, i))
我已经解释过了.
希望这可以解释上述大部分技巧.
Hope this explains most of the above tricks.
