将包含1个逗号分隔字符串的列表转换为二维列表

3
我不太了解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)   

要分割的元素是否总是在索引3上,输入列表是否总是一维的? - zwer
应该是通用的并且能够适用更多的输入吗? - SocketPlayer
@zwer 是的,它始终位于第三个索引位置。 - user4831795
@SocketPlayer,我不知道你所说的“通用”是什么意思,但这个列表有点像另一个列表的一部分,即 l=[inp1,inp2,inp3,...],但是每个输入列表始终具有相同的固定大小,并带有第3个位置处的逗号分隔字符串。 - user4831795
2个回答

3

鉴于硬性约束条件,您可以使用列表推导和切片使其更整洁:

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次列表创建和1次列表连接,并且除非inp [3]非常长,否则列表推导式不会显示其真正的优势以抵消列表创建开销。


0

您可以使用生成器表达式在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']]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接