代码之家  ›  专栏  ›  技术社区  ›  PanDe

用逗号分隔的值从另一个列表生成列表

  •  3
  • PanDe  · 技术社区  · 6 年前

    我的名单是:

    mylist = ['7','8,9','10', '11,12']
    

    我想要一份清单:

    ['7','8','9','10','11','12']
    

    我能得到的最接近的是使用以下代码:

    mylist = ['7','8,9','10', '11,12']
    ab = []
    for e in mylist:
        if ',' in e:
           ab.append(e.split(','))
    mylist2 = [x for x in mylist  if ',' not in x]
    print mylist2 #clean list
    
    merged = []
    for f in ab:
         merged =  mylist2 + f
    

    但是,这省略了‘8’,‘9’序列,我怎么能轻易地实现呢?

    3 回复  |  直到 6 年前
        1
  •  4
  •   abarnert    6 年前

    现有代码的问题很简单:

    merged = []
    for f in ab:
         merged =  mylist2 + f
    

    对于每一个 f 在里面 ab ,你忘了里面的东西 merged 换成 mylist + f . 所以,最后,只有最后一个 f 结束于 合并 .

    你可能想要这样的东西:

    for f in ab:
        mylist2 = mylist2 + f
    merged = mylist2
    

    这样我们就不断地增加 F 把结果放回同一个地方。


    然而,有一个更简单的方法来解决这个问题。与其抽出带逗号的,然后再把它们加回去,不如把所有事情都处理好:

    mylist = ['7','8,9','10', '11,12']
    merged = []
    for element in mylist:
        elements = element.split(',')
        merged += elements
    

    这样可以保存所有的东西,并保持原来的顺序,而且简单得多。(注意到 '7'.split(',') 很好它返回一个元素列表 ['7'] ,您可以使用与 ['8', '9'] )

    您可以先使用一个comprehension来分割每个元素,然后合并并展平结果,从而使其更加简洁。写这个有几种方法,但这里有两种:

    merged = [subelement for element in mylist for subelement in element.split(',')]
    
    from itertools import chain
    merged = list(chain.from_iterable(element.split(',') for element in mylist))
    
        2
  •  2
  •   Ma0    6 年前

    您可以使用列表理解:

    mylist = ['7','8,9','10', '11,12']
    merged = [n for sublist in [packet.split(',') for packet in mylist] for n in sublist]
    print(merged)   # -> ['7', '8', '9', '10', '11', '12']
    

    这充分利用了一个事实 '7'.split(',') 收益率 ['7'] 而不是,比方说,提出一个错误。因此,我们可以使用 split() 在所有条目上,最后 压扁 我们创建的嵌套结构。


    编辑:

    正如@abarnet所指出的,如果重写为:

    merged = [n for packet in mylist for n in packet.split()]
    
        3
  •  0
  •   Shivid    6 年前

    试试这个;

    import numpy as np
    merged = list(np.concatenate([i.split(',') for i in mylist]))