Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将具有1个逗号分隔字符串的列表转换为2d列表_Python_Python 3.x - Fatal编程技术网

Python 将具有1个逗号分隔字符串的列表转换为2d列表

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

我不太了解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 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,…',但每个输入列表的大小都是固定的,第三位是逗号分隔的字符串。