Python 将具有1个逗号分隔字符串的列表转换为2d列表
我不太了解python的Python 将具有1个逗号分隔字符串的列表转换为2d列表,python,python-3.x,Python,Python 3.x,我不太了解python的map/reduce函数,但是有没有办法将这个输入列表转换为给定的输出 inp = [1,2,3,"a,b,c",4,"blah"] outp = [ [1,2,3,'a',4,'blah'], [1,2,3,'b',4,'blah'], [1,2,3,'c',4,'blah'] ] 到目前为止,我只是通过使用循环来实现这一点,这看起来并不是一种有效的方法: inp[3]=inp[3].split(',') out=[] for i i
map
/reduce
函数,但是有没有办法将这个输入列表转换为给定的输出
inp = [1,2,3,"a,b,c",4,"blah"]
outp = [
[1,2,3,'a',4,'blah'],
[1,2,3,'b',4,'blah'],
[1,2,3,'c',4,'blah']
]
到目前为止,我只是通过使用循环来实现这一点,这看起来并不是一种有效的方法:
inp[3]=inp[3].split(',')
out=[]
for i in inp[3]:
k=list(inp)
k[3]=i
out.append(k)
考虑到这些硬约束,您可以使用列表理解和切片将其加快一点,使其更整洁一点:
inp = [1, 2, 3, "a,b,c", 4, "blah"]
outp = [inp[:3] + [i] + inp[4:] for i in inp[3].split(",")]
# [[1, 2, 3, 'a', 4, 'blah'],
# [1, 2, 3, 'b', 4, 'blah'],
# [1, 2, 3, 'c', 4, 'blah']]
但这不会降低复杂性。事实上,对于您的示例,它可能会比您的方法运行得慢,因为它必须在
inp[3]
中为每个条目执行3个列表创建和一个列表连接,除非inp[3]
非常长,列表理解不会显示其抵消列表创建开销的真正优势。您可以在next
函数中使用生成器表达式找到所需字符串的索引,然后使用列表理解创建预期结果:
In [19]: ind = next(i for i, j in enumerate(inp) if isinstance(j, str) and ',' in j)
In [20]: [[*inp[:ind], i, *inp[ind + 1:]] for i in inp[ind].split(',')]
Out[20]:
[[1, 2, 3, 'a', 4, 'blah'],
[1, 2, 3, 'b', 4, 'blah'],
[1, 2, 3, 'c', 4, 'blah']]
要拆分的元素是否总是在索引
3
上?输入列表是否总是1D?它是否应该是泛型的并且可以处理更多的输入?@zwer是的,它总是在第三个索引上。@SocketPlayer我不知道泛型是什么意思,但是这个列表是另一个列表的一部分,即'l=[inp1,inp2,inp3,…',但每个输入列表的大小都是固定的,第三位是逗号分隔的字符串。