假设我有一个列表,其中包含一个已知的分隔符;
。如果列表包含由该分隔符分隔的字符串,我将如何展平?例如:
>>> [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
?
答案 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']