我将如何打开一个平面列表? [复制]

Posted

技术标签:

【中文标题】我将如何打开一个平面列表? [复制]【英文标题】:How would I unpack a flat list? [duplicate] 【发布时间】:2019-06-19 20:07:38 【问题描述】:

请理解,我搜索了这个,它已经有一个answer。但是我正在寻找一种不同的方法来获得这个结果。这可能会被标记为duplicate,尽管我认为可能使用itertools (很可能是groupby

假设我有一个列表data。我一次想要 3 个值,假设列表是值的数量ⁿ,以排除最后不正确的值。

data = [1, 2, 3, 4, 5, 6,...]

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

for a, b, c in data:
    #perform operations
    pass

现在使用上面的代码,我希望 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

【问题讨论】:

无论如何都标记为重复。没找到那个。虽然我确实找到了this 回答我试图找到的那个。 【参考方案1】:

这是iterzip 的hacky 解决方案:

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

for a, b, c in zip(*[d]*3):
    print(a, b, c)

输出:

1 2 3
4 5 6

此外,如果您希望它在原始列表不能被三整除时遍历所有内容,您可以使用来自itertoolszip_longest

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)

输出:

1 2 3
4 5 6
7 None None

【讨论】:

我喜欢这个谢谢!现在我想看看这与@jspcal 的方法之间的性能差异 这很酷,在一个列表中有 3 个对迭代器的相同引用的副本 请注意,此解决方案正是文档中的itertools grouper recipe,也可在第三方more_itertools.grouper 中找到。 @Jaba jspcal 的方法应该更快,因为我正在构建一个列表、解包并将内容传递到 zip 中。然而迭代一个列表已经非常快了,我的假设是你的性能瓶颈将是你对 a、b 和 c 所做的事情,而不仅仅是迭代。 @Jaba 上面的变体是三者中最快的。时间为(3.5、7 和 9.18 秒)。请注意,您的代码中有一个错误,您使用已经用完的迭代来测试第二个变体。我得到的时间是在我修复了这个错误之后。【参考方案2】:

也许使用迭代器并在需要块中的下一个元素时递增迭代器:

data = [1, 2, 3, 4, 5, 6]
it = iter(data)

for x in it:
    a = x
    b = next(it)
    c = next(it)
    print(a, b, c)
    # Do something with a, b, and c

【讨论】:

谢谢,我知道这是一种更传统的方法。不幸的是,这不是我想要的,我想在 for 声明中解压它。

以上是关于我将如何打开一个平面列表? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Mobx 设置数据平面列表? [复制]

如何在.net中更改平面列表框的黑色边框颜色? [复制]

如何在本机反应中从平面列表中设置 Json 数组

如何在 ios 中打开一个 sqlite 文件进行阅读而不复制到文档?

如何在 React Native 的平面列表中的可触摸不透明度内执行函数?

在 React Native 中使用平面列表数据导航