我对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)
答案 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']]