【问题标题】:Cyclically pop the contents of one list into a list of lists循环将一个列表的内容弹出到列表列表中
【发布时间】:2017-09-20 06:27:05
【问题描述】:

我有一个清单

main_list = [1,2,3,4,5,6,7,8,9,10,11,12]

我想将列表拆分为多个列表,我希望输出如下所示-

list1 = [1,9]    
list2 = [2,10]    
list3 = [3,11]    
list4 = [4,12]    
list5 = [5]    
list6 = [6]    
list7 = [7]
list8 = [8]

【问题讨论】:

  • 要根据什么条件拆分原始列表?
  • @Jack 描述你的分裂逻辑
  • 弹出列表的第一个元素并将其附加到列表 1 中,弹出列表的第二个元素并将其附加到列表 2 中,依此类推。每个元素都应附加在连续列表中
  • @Jack 你接受了 3 中最糟糕的解决方案。真可惜。
  • 好吧,这不是一个花哨的解决方案,其他的可以更好。但它简单、易于理解并且不使用额外的库。

标签: python list itertools cycle nested-lists


【解决方案1】:

这可以通过使用itertools.cycle 几行来解决。

from itertools import cycle

main_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
lists = [[] for _ in range(8)]

for x, y in zip(cycle(lists), main_list):
     x.append(y)

复杂性:O(n).


print(lists)
[[1, 9], [2, 10], [3, 11], [4, 12], [5], [6], [7], [8]]

【讨论】:

  • 这确实是一个不错的解决方案。 groupby 也有点优雅,尽管 O(n.log n) 复杂。
  • 谢谢。只是好奇,您是否注意到对 python 问题的支持减少了?在过去的几天里,我写了很多答案,其中 AFAICT 是正确的。通常,没有评论,没有投票。其他回答者似乎也一样。
  • @EricDuminil 如果您说的是最近几天,那是因为周末通常是停机时间。如果您说的是一般情况,我想它是gamesmanship mentality。我喜欢得到认可和支持,就像下一个人一样,但更重要的是,我相信体育精神。因此,如果有其他回答者告诉我他们已经投了赞成票,我几乎总是会回礼。我宁愿我们的答案都停留在 +1,而不是都停留在 0。
【解决方案2】:

如果我正确理解您的问题,您希望将整数按modulo 8 分组:

from itertools import groupby

def f(x):
    return (x-1) % 8

main_list = [1,2,3,4,5,6,7,8,9,10,11,12]

main_list.sort(key=f)
print(main_list)
# [1, 9, 2, 10, 3, 11, 4, 12, 5, 6, 7, 8]

print([list(l) for _,l in groupby(main_list, key=f)])
# [[1, 9], [2, 10], [3, 11], [4, 12], [5], [6], [7], [8]]

【讨论】:

    【解决方案3】:

    这是一个简单的代码:

    main_list = [1,2,3,4,5,6,7,8,9,10,11,12]
    
    list_count = 8
    lists = [[] for _ in range(list_count)]
    
    for count, item in enumerate(main_list):
        lists[count % list_count].append(item)
    
    print(lists)
    

    输出:

    [[1, 9], [2, 10], [3, 11], [4, 12], [5], [6], [7], [8]]
    

    编辑

    如果

    main_list = [(1,1),(1,2),(1,3),(1,4),(2,1),(2,2),(2,3),(2,4),(3,1),(3,2)]
    

    然后输出

    [[(1, 1), (3, 1)], [(1, 2), (3, 2)], [(1, 3)], [(1, 4)], [(2, 1)], [(2, 2)], [(2, 3)], [(2, 4)]]
    

    【讨论】:

      【解决方案4】:

      more_itertools 是一个第三方库,为此实现了一个工具:

      > pip install more_itertools
      

      代码

      import more_itertools as mit
      
      
      iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
      
      [list(c) for c in mit.distribute(8, iterable)]
      # [[1, 9], [2, 10], [3, 11], [4, 12], [5], [6], [7], [8]]
      

      可迭代的元素分布在n 块中。详情请见more_itertools docs


      另一个简单的方法,这个问题独有的:

      import itertools as it
      
      
      lst, n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 8
      
      [list(filter(None, i)) for i in it.zip_longest(lst[:n], lst[n:])]
      # [[1, 9], [2, 10], [3, 11], [4, 12], [5], [6], [7], [8]]
      

      两个切片列表在从每个子元素中过滤None 时被完全压缩。

      【讨论】:

        猜你喜欢
        • 2023-02-24
        • 1970-01-01
        • 1970-01-01
        • 2013-07-20
        • 2022-11-12
        • 2019-08-08
        • 1970-01-01
        • 2021-10-31
        • 1970-01-01
        相关资源
        最近更新 更多