拆开一个嵌套列表

3
我的问题很简单。 有两个列表。 第一个是整数列表:
a = [1, 2, 3]

另一个是列表的列表:
b = [['a', 'b'], ['c', 'd'], ['e', 'f']]

我该如何得到下面的结果:
result = [[1, 'a', 'b'], [2, 'c', 'd'], [3, 'e', 'f']]

谢谢。

1
你的 b 看起来无效。如果它是一个字符串列表的列表,请正确格式化它。 - eumiro
2
b真的包含对自身的引用吗?祝你好运拆开它! - John La Rooy
@gnibbler:试试这个:a = range(6); a[1] = a; print a - Joel Cornett
1
@JoelCornett,是的,它可以检测到循环并巧妙地用“...”替换它们,但这与展开列表不同。 - John La Rooy
5个回答

10
>>> a = [1, 2, 3]
>>> b = [['a', 'b'], ['c', 'd'], ['e', 'f']]
>>> [[aa] + bb for aa, bb in zip(a, b)]
[[1, 'a', 'b'], [2, 'c', 'd'], [3, 'e', 'f']]

2
[1,a,b] 是一个包含一个整数和两个什么的列表?ab 是什么? - eumiro
@sgzhan 这个例子适用于字符串,也适用于其他数据类型,比如你刚提到的任何类型。 - jamylak

3

在Python3中

>>> a = [1, 2, 3]
>>> b = [['a', 'b'], ['c', 'd'], ['e', 'f']]
>>> [aa+bb for *aa, bb in zip(a,b)]
[[1, 'a', 'b'], [2, 'c', 'd'], [3, 'e', 'f']]

1
虽然这种方法有趣,但如果有3个列表,比如a=[1,2,3]``b=[6,7,8]``c=[['a','b'],['c','d'],['e','f']],此方法就不能使用,因为只能使用一个星号表达式。 - jamylak
@jamylak,不用--在您定义的abc上这完全正常工作。只需要一个星号表达式即可。 - senderle
@senderle >>> [aa+bb+cc for *aa, bb, cc in zip(a,b,c)] TypeError: 只能将列表连接(而不是“int”)到列表 >>> [aa+bb+cc for *aa, *bb, cc in zip(a,b,c)] SyntaxError: 分配中有两个星号表达式 - jamylak
2
@jamylak, >>> [aa+cc for *aa, cc in zip(a, b, c)] -> [[1, 6, 'a', 'b'], [2, 7, 'c', 'd'], [3, 8, 'e', 'f]] - senderle
1
@senderle,没错,我的错误,我没有以那种方式考虑过,谢谢 :D - jamylak
@jamylak,嗯,正如我所知道的那样,扩展解包有时可能是不直观的! - senderle

0
以下Python代码将解包每个列表并按照您指定的形式进行组装。
[[a[i]] + b[i]  for i in range(min(len(a),len(b)))]

0

另一种方法是:

index = 0
l = b
for i in a:
    l[index].append(i)
    index += 1

这将把项目附加到右侧(错误的一侧)...请注意,如果您选择使用insert(0,x),则它是O(N)操作。您可以使用deque使其成为O(1),但这可能太过分了,当您可以只使用列表理解时。 - jamylak

0

使用Python的enumerate函数,您可以循环遍历带有索引的列表。使用x.extend(y)将在列表y中前置列表x中的值。

a = [1, 2, 3]
b = [['a', 'b'], ['c', 'd'], ['e', 'f']]

result = []
for index, value in enumerate(a):
    aa = [value]
    aa.extend(b[index])
    result.append(aa)

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