【问题标题】:How to combine two array into a list which have a inner-list?如何将两个数组组合成一个具有内部列表的列表?
【发布时间】:2019-03-10 15:44:46
【问题描述】:

我有两个清单:

a=[0,0,0,1,1,1,1,2,2]
b=[2,5,12,2,3,8,9,4,6]

我想得到:

c=[[0,2,5,12],[1,2,3,8,9],[2,4,6]]

A和b相互关联,a[i]与b[i]相关,当a中的值像0变为1,12在@987654329的第一个内部列表中结束@。

我用 if else 语句尝试过,但失败了

如何在python中获取c?

【问题讨论】:

  • 向我们展示您如何使用列表迭代来做到这一点。

标签: arrays python-3.x list numpy


【解决方案1】:

此代码以足够好的方式生成c(前提是a 和b 始终以与示例中相同的方式进行调整):

a=[0,0,0,1,1,1,1,2,2]
b=[2,5,12,2,3,8,9,4,6]

c = []

i = 0

while i < len(a):
  d = a.count(a[i])
  c.append([a[i]] + b[i:i + d])
  i += d

print(c) # ==> [[0, 2, 5, 12], [1, 2, 3, 8, 9], [2, 4, 6]]

【讨论】:

    【解决方案2】:

    我们可以zip 列表,按a 中的第一个值分组,然后用第二个值创建列表:

    from itertools import groupby
    from operator import itemgetter
    
    a=[0,0,0,1,1,1,1,2,2]
    b=[2,5,12,2,3,8,9,4,6]
    
    [list(map(itemgetter(1), group)) for _, group in groupby(zip(a, b), key=itemgetter(0))]
    
    #[[2, 5, 12], [2, 3, 8, 9], [4, 6]]
    

    【讨论】:

      【解决方案3】:

      类似于@Thierry Lathuille 的回答,但实际上确实按照 OP 的要求将键添加到子列表中:

      import itertools as it
      
      ib = iter(b)
      [[k, *(next(ib) for _ in gr)] for k, gr in it.groupby(a)]
      # [[0, 2, 5, 12], [1, 2, 3, 8, 9], [2, 4, 6]]
      

      【讨论】:

        【解决方案4】:

        这是我的简单解决方案。请注意,您通过列表 a 中的元素计数来拆分列表。 deque 用于在 O(1) 时间内从左侧弹出元素。

        import itertools 
        from collections import Counter, deque
        
        a = [0,0,0,1,1,1,1,2,2]
        b = deque([2,5,12,2,3,8,9,4,6])
        c = Counter(a)
        
        new_list=[] 
        for x in c:
            new_list.append([x]+[b.popleft() for i in range(a[x])])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-12-05
          • 2014-06-04
          • 1970-01-01
          • 1970-01-01
          • 2018-10-05
          • 2011-09-26
          • 2015-10-30
          相关资源
          最近更新 更多