【问题标题】:Grouping every three items together in list - Python [duplicate]在列表中将每三个项目分组在一起 - Python [重复]
【发布时间】:2017-10-21 15:08:46
【问题描述】:

我有一个由重复模式组成的列表,即

list=['a','1','first','b','2','second','c','3','third','4','d','fourth']`

我不确定这个列表会有多长,它可能会相当长,但我想创建重复模式的列表,即与填充的名称一起

list_1=['a','1','first']
list_2=['b','2','second']
list_3=['c','3','third']
..... etc

我可以用来实现此目的的最佳基本代码(不需要导入模块)是什么?

【问题讨论】:

  • 建议不要使用list作为变量名,因为这样会隐藏python的list类型。

标签: python list


【解决方案1】:

您可以使用zip()获取块:

>>> lst = ['a','1','first','b','2','second','c','3','third','4','d','fourth']
>>> list(zip(*[iter(lst)]*3))
[('a', '1', 'first'), ('b', '2', 'second'), ('c', '3', 'third'), ('4', 'd', 'fourth')]

使用zip() 可以避免创建中间列表,如果您的列表很长,这可能很重要。

zip(*[iter(lst)]*3) 可以重写:

i = iter(lst)   # Create iterable from list
zip(i, i, i)    # zip the iterable 3 times, giving chunks of the original list in 3

但前者虽然有点神秘,但更笼统。

如果您需要此列表的名称,那么我建议您使用字典:

>>> d = {'list_{}'.format(i): e for i, e in enumerate(zip(*[iter(lst)]*3), 1)}
>>> d
{'list_1': ('a', '1', 'first'),
 'list_2': ('b', '2', 'second'),
 'list_3': ('c', '3', 'third'),
 'list_4': ('4', 'd', 'fourth')}
>>> d['list_2']
('b', '2', 'second')

【讨论】:

  • zip(*[iter(l)]*3) 这是一个很好的咒语,但是如果您要解释这里发生的事情,这个答案将会大大改善,因为对于新手来说,正则表达式很清楚。
  • 这也比原始的朴素 zip 解决方案要好得多,因为它可以推广到任何所需大小的块。
  • 这里有一个微妙的地方。要更准确地理解这一点,您需要知道 [iter(lst)] * 3 返回一个包含三个对 THE SAME OBJECT 的引用的列表。然后我们做了一点花招:我们使用* 运算符将这些对象传递给zip 函数。 zip 函数强制评估这个单个迭代器,以三个为一组,从左到右一次发生一个,直到迭代器用完要迭代的项目。
  • 严格来说,在list(zip(*[iter(lst)]*3)) 中对list 的调用是免费的,因为zip 已经返回了一个列表。
  • zip() 在 Py3 中不返回列表
【解决方案2】:

试试这个

chunks = [data[x:x+3] for x in xrange(0, len(data), 3)]

它将创建包含 3 个项目的子列表

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2021-12-22
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2021-02-13
    相关资源
    最近更新 更多