如何在单个操作中使用已知的分隔符拼合列表列表

时间:2018-12-24 22:21:45

标签: python

假设我有一个列表,其中包含一个已知的分隔符;。如果列表包含由该分隔符分隔的字符串,我将如何展平?例如:

>>> [item for item in [1,2,'2;3']]
[1, 2, '2;3']

我可以用第二个for循环来详细地做到这一点:

vals = []
separator = ';'
for _val in [1,2,'2;3']:
    _val = str(_val)
    if separator not in _val: 
        vals.append(_val)
    else:
        vals.extend(_val.split(separator))

有没有办法在单个操作中做到这一点,例如使用列表理解或chain

4 个答案:

答案 0 :(得分:4)

由于您希望最终值全部为字符串,因此您可以在转换为字符串并使用itertools.chain.from_iterable之后对所有值都调用split:

import itertools
c = itertools.chain.from_iterable(str(item).split(";") for item in [1,2,'2;3'])
print(list(c))

结果:

['1', '2', '2', '3']

答案 1 :(得分:2)

您可以使用列表理解(如果不需要int项,则删除int类型强制转换)

test = [1, 2, "3;4", 5]
res = [int(item) for items in test for item in str(items).split(";")]
print(res)

结果:

[1, 2, 3, 4, 5]

答案 2 :(得分:1)

如果您希望所有值都为整数,我将使用生成器来执行此操作:

def values(items):
    for x in items:
        if isinstance(x, str) and separator in x:
            yield from map(int, x.split(separator))
        yield x

separator = ';'    
vals = list(values([ 1, 2, '2;3' ]))

答案 3 :(得分:0)

这也可以不用嵌套列表理解来导入:

sep = ';'
a = [item for sublist in [str(i).split(sep) for i in lst] for item in sublist]

输出:

['1', '2', '2', '3']