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

时间:2018-06-08 07:27:06

标签: python list

我的列表为:

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 个答案:

答案 0 :(得分:4)

现有代码的问题非常简单:

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

对于f中的每个ab,您会忘记merged中的所有内容,并将其替换为mylist + f。因此,最后,只有最后f结束于merged

你可能想要这样的东西:

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']相同的方式将其添加到累积列表中。)

通过首先使用理解来分割每个元素,然后合并和展平结果,可以使这更简洁。有几种方法可以写这个,但这里有几个:

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))

答案 1 :(得分:2)

你可以使用列表理解:

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()]

答案 2 :(得分:0)

也试试这个;

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