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

时间:2018-10-03 20:37:47

标签: 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 in inp[3]:
    k=list(inp)
    k[3]=i
    out.append(k)   

2 个答案:

答案 0 :(得分:4)

鉴于硬性约束,您可以使用列表理解和切片方法加快速度使其更整洁:

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']]

但是它不会降低复杂性。实际上,它可能会比您的示例方法慢,因为它必须执行3个列表创建,并且inp[3]中每个 entry 的列表串联,除非inp[3]为很长一段时间,列表理解不会显示出其真正的优势来抵消列表创建的开销。

答案 1 :(得分:1)

您可以在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']]