我该如何打开平面清单?

Jab*_*Jab 3 python python-3.x

请理解,我搜索了这个,它已经有了答案.但是我正在寻找一种不同的方法来获得这个结果.这可能被标记为重复,虽然我认为这可能使用itertools (最有可能groupby)有一个更清晰的答案.

说我有一个清单data.我希望一次有3个值,假设列表是值的数量,以便最后排除不正确的值.

data = [1, 2, 3, 4, 5, 6,...]
Run Code Online (Sandbox Code Playgroud)

这是我想要遍历列表的方式(这段代码显然不起作用):

for a, b, c in data:
    #perform operations
    pass
Run Code Online (Sandbox Code Playgroud)

现在有了上面的代码,我想a, b, c成为1, 2, 3然后4, 5, 6分别在每个迭代.我确信那里有一个更清洁的方法,而不是我链接的答案.

对于那些不想点击链接以查看我所指的方法的懒人,这里是:

如果要通过成对的连续元素遍历列表,则可以使用切片:

>>>myList = [4, 5, 7, 23, 45, 65, 3445, 234]
>>>for x,y in (myList[i:i+2] for i in range(0,len(myList),2)):
print(x,y)

4 5
7 23
45 65
3445 234
Run Code Online (Sandbox Code Playgroud)

Pri*_*usa 7

这是一个hacky解决方案:iterzip:

i =  [1, 2, 3, 4, 5, 6]
d = iter(i)

for a, b, c in zip(*[d]*3):
    print(a, b, c)
Run Code Online (Sandbox Code Playgroud)

输出:

1 2 3
4 5 6
Run Code Online (Sandbox Code Playgroud)

此外,如果你想让它遍历的一切,当你最初的名单是不是由三个可以用整除zip_longestitertools:

from itertools import zip_longest


i =  [1, 2, 3, 4, 5, 6, 7]
d = iter(i)

for a, b, c in zip_longest(*[d]*3):
  print(a, b, c)
Run Code Online (Sandbox Code Playgroud)

输出:

1 2 3
4 5 6
7 None None
Run Code Online (Sandbox Code Playgroud)

  • 这很酷,对列表中的迭代器有3个相同引用的副本 (2认同)
  • @Jaba jspcal的方法应该更快,因为我正在构建一个列表,解压缩并将内容传递给zip.然而,迭代列表已经非常快了,我的假设是你的性能瓶颈将是你将用a,b和c做的,而不仅仅是迭代. (2认同)