【问题标题】:How to retrieve groups of n items in list如何检索列表中的 n 个项目组
【发布时间】:2015-11-23 21:29:30
【问题描述】:

在 Python 中,如何打印列表中的每个三重(或 n 组)项目?

我已经搜索并找到了使用 itertools 模块处理对的各种解决方案,但我未能将它们调整为三人一组。我将避免在此处包含我的尝试,因为我不确定它们是否完全表明正确的方法。

例子:

my_list = ["abra", "cada", "bra", "hum", "dee", "dum"]

我想在一行中打印第一个三元组,然后在下一行打印下一个三元组:

"Abra cada bra"
"Hum dee dum"

编辑:为了扩大一般性,已将问题编辑为涵盖“n 个项目的组”,而不仅仅是三元组。

【问题讨论】:

  • 什么意思,项目 0,1,2, ;然后是 3、4、5; 6、7、8?还是完全不同的东西?
  • @AnttiHaapala:是的(1、2、3;然后是 4、5、6;...)

标签: python itertools


【解决方案1】:

你可以直接使用 for 循环

i = 0
list = ["abra", "cada", "bra", "hum", "dee", "dum"]
while i < len(list):
  print(" ".join(list[i:i+3]))
  i += 3

【讨论】:

  • 请记住不要将变量命名为数据类型。所以列表list 应该命名为l 而不是list
【解决方案2】:

使用索引的列表推导是一种相当简单的方法。

print([my_list[i:i+3] for i in range(0, len(my_list), 3)])

或根据需要打印:

for i in range(0, len(my_list), 3):
    print(' '.join(list[i:i+3]))

或者:

for t in zip(my_list[::3], my_list[1::3], my_list[2::3]):
    print(' '.join(t))

【讨论】:

    【解决方案3】:

    试试:

    l1 = iter(list)
    print '\n'.join([ ' '.join(x) for x in zip(*[l1]*3) ])
    

    【讨论】:

    • 你的切片答案怎么了?
    • 这样更好。 3 可以很容易地更改为 n。毕竟他的问题标题中有“n”。
    【解决方案4】:

    如果你想要一个 itertools 答案:

    from itertools import islice
    
    my_list = ["abra", "cada", "bra", "hum", "dee", "dum"]
    it = iter(my_list)
    for sli in iter(lambda:list(islice(it, 3)), []):
        print("".join(sli))
    

    或者使用 zip 和 iter:

    my_list = ["abra", "cada", "bra", "hum", "dee", "dum"]
    it = iter(my_list)
    for sli in zip(it,it,it):
        print("".join(sli))
    

    如果你想给每个匹配和格式编号:

    n = 3
    it = iter(my_list)
    rn = map(str, range(1, n+1))
    for sli in zip(it, it, it):
        print(" ".join(["{}: {}".format(a,b) for a,b in zip(rn, sli)]))
    

    输出:

    1: abra 2: cada 3: bra
    1: hum 2: dee 3: dum
    

    对于任意数量的元素进行分组,有来自 itertools 的 grouper 配方:

    from itertools import izip_longest
    def grouper(iterable, n, fillvalue=None):
        "Collect data into fixed-length chunks or blocks"
        # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
        args = [iter(iterable)] * n
        return izip_longest(fillvalue=fillvalue, *args)
    
    for grp in (grouper(my_list,3)):
        print("".join(grp))
    

    【讨论】:

    • 感谢您提供这些替代方案!我接受了这个答案,因为它涵盖了我可能必须处理的一些情况。但对于未来的读者,我应该提一下,下面的for loop 解决方案可能也是最简单的解决方案。
    • 不用担心,您标记了 itertools,所以我提供了一些 itertools 解决方案,尽管使用 iter 和 zip 可能仍然比 for 循环和切片更好
    猜你喜欢
    • 2014-10-03
    • 2016-08-24
    • 2019-04-16
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多