合并一个字符串列表和一个列表列表

3

这可能是一个重复的问题,但我找不到一个具体的答案。

在撰写这个问题时,我也找到了一个答案,但想知道是否有更好的选项或者一种不需要知道哪个项目是字符串列表的方法。

我的问题是:

la=['a', 'b', 'c']
lb=[['d','e'], ['f','g'], ['i','j']]

I would like:

[['a','d','e'], ['b','f','g'], ['c','i','j']]

我发现以下内容特别适用于我的例子:
la=['a', 'b', 'c']
lb=[['d','e'], ['f','g'], ['i','j']]
[ [x] + y for x,y in zip(la, lb)]
[['a', 'd', 'e'], ['b', 'f', 'g'], ['c', 'i', 'j']]

它的运行原因是在连接之前将字符串列表转换为列表,并避免了TypeError: cannot concatenate 'str' and 'list' objects错误。

是否有更加优雅的解决方案?


4
有什么比自然且一行的解决方案更加优雅? - John Coleman
1
@JohnColeman 同意,这再好不过了。 - hschne
1
@hSchroedl 这个解决方案是如此自然,以至于我在阅读问题的第一部分后不到30秒就将其写成答案并提交了。但当我看到 OP 已经有了这个解决方案时,我立刻删除了我的答案,这让我对问题的意义产生了疑问。 - John Coleman
你认为哪个问题是重复的? - amirouche
如果该项不是字符串列表会发生什么? - amirouche
是的,我理解你的观点。只是在推导式中,直到我将x+y更改为[x]+y之前,我一直很难创建我的解决方案。所以我想知道是否有一种类似的方法,即使不知道其中一个是字符串列表,也可以将每个列表项展平并一次性合并成一个列表。 - mrkbutty
2个回答

0
你可以使用 numpy.column_stack:
>>> la=['a', 'b', 'c']
>>> lb=[['d','e'], ['f','g'], ['i','j']]
>>> import numpy as np

>>> np.column_stack((la,lb))
array([['a', 'd', 'e'],
       ['b', 'f', 'g'],
       ['c', 'i', 'j']], 
      dtype='|S1')

为什么要踩我?我的回答有问题吗?我很乐意听取我的错误! - Mazdak

0
如果你想要一个表达式,我想不出比上面使用zip更好的了。如果你想要明确地将la中的元素插入到lb的元素头部,我会这样做:
for i in range( len(la) ):
    lb[i].insert(0, la[i])

这可以避免需要知道zip是什么或做什么。可能还首先检查:

if len(la) != len(lb) : raise IndexError, "List lengths differ"

如果使用“+”运算符,则当lb比la长时会出现问题。顺便说一下,这在边界情况/鸭子类型方面并不完全相同。使用insert方法更安全,因为它仅适用于类似于列表的对象,而“+”则不是。

此外,就个人而言,我会将上述代码写在一行中。

for i in range( len(la) ): lb[i].insert(0, la[i])

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