嵌套结构:Python中的列表嵌套元组的列表

4

我正在处理一个嵌套结构,它看起来像这样:

list_of_lists= [[("aaa"),("bbb")],[("ccc"),("ddd")],[("eee"),("fff")]]

我需要添加一列元素,看起来像这样:

 column_to_add = ["string1", "string2", "string3"]

最终结果应该像这样:
[[("aaa", "string1"),("bbb", "string1")],[("ccc", "string2"),("ddd", "string2")],[("eee", "string3"),("fff", "string3")]]

我尝试过类似这样的东西:

result= []
for internal_list in list_of_lists:
    for tuple in internal_list:
        for z in tuple:
            for new_string in column_to_add:
                kk=list(tuple)
                result = tuple.append(new_string)

但它似乎根本不起作用。 有人能帮帮我吗?

非常感谢您的帮助!


1
你的逻辑是错误的。对于每个元组,你正在循环遍历 column_to_add。你想要将 internal_list 的每个索引与 column_to_add 的匹配索引相匹配。Zipa 的答案通过 enumerate 实现了这一点,它提供了一个可用的索引。Rakesh 的答案使用 zip 将两个列表压缩在一起,他解包并使用它们。两者都使用列表推导式,类似于 for 循环将项目附加到初始空列表中。 - Andrew Allen
现在更清楚了,所以如果我理解正确,使用zip或enumerate是完全等价的。对吗? - iraciv94
1
它们都创建迭代器(即时生成)对象,但所创建的对象略有不同。其中一个(zip)是实际匹配元素的元组,而另一个是(索引,项)元组,让您可以自由使用索引。在这种情况下,我更喜欢使用enumerate,因为代码更加明确。 - Andrew Allen
5个回答

5
如果您的数据看起来像这样:
list_of_lists= [[("aaa", ),("bbb", )],[("ccc", ),("ddd", )],[("eee", ),("fff", )]]

您应该使用:

[[y + (column_to_add[i], ) for y in x] for i, x in enumerate(list_of_lists)]

这会产生以下结果:
#[[('aaa', 'string1'), ('bbb', 'string1')],
# [('ccc', 'string2'), ('ddd', 'string2')],
# [('eee', 'string3'), ('fff', 'string3')]]

3
使用zip和嵌套列表推导式 例子:
list_of_lists= [[("aaa"),("bbb")],[("ccc"),("ddd")],[("eee"),("fff")]]
column_to_add = ["string1", "string2", "string3"]

print([[(i, n) for i in m] for m,n in zip(list_of_lists, column_to_add)])

输出:

[[('aaa', 'string1'), ('bbb', 'string1')],
 [('ccc', 'string2'), ('ddd', 'string2')],
 [('eee', 'string3'), ('fff', 'string3')]]

2
list_of_lists= [[("aaa"),("bbb")],[("ccc"),("ddd")],[("eee"),("fff")]]
column_to_add = ["string1", "string2", "string3"]
res  = list(map(lambda x,y: [(i,y) for i in x], list_of_lists, column_to_add))
print(res)

输出

[
   [('aaa', 'string1'), ('bbb', 'string1')], 
   [('ccc', 'string2'), ('ddd', 'string2')], 
   [('eee', 'string3'), ('fff', 'string3')]
]

2
你需要类似于zip()的东西。
首先,将(aaa,bbb)string1配对。
a = [[("aaa"),("bbb")],[("ccc"),("ddd")],[("eee"),("fff")]]
b = ["string1", "string2", "string3"]
zipped_data = list(zip(a, b))

# zipped_data = [(['aaa', 'bbb'], 'string1'), (['ccc', 'ddd'], 'string2'), (['eee', 'fff'], 'string3')]

然后,让string1与元组(aaa, bbb)的每个迭代器配对。


new_list = []
for u in zipped_data:
    new_list.append([(u[0][0], u[1]), (u[0][1], u[1])])
print(new_list)

最初的回答是:

输出为


[[('aaa', 'string1'), ('bbb', 'string1')], [('ccc', 'string2'), ('ddd', 'string2')], [('eee', 'string3'), ('fff', 'string3')]]

1

你可以使用列表推导式。

lst = [[("aaa",), ("bbb",)], [("ccc",), ("ddd",)], [("eee",), ("fff",)]]
col = ["string1", "string2", "string3"]

result = [[(*tup, col[i]) for tup in lst[i]] for i in range(len(lst))]

输出:

[[('aaa', 'string1'), ('bbb', 'string1')], [('ccc', 'string2'), ('ddd', 'string2')], [('eee', 'string3'), ('fff', 'string3')]]

更新。

使用 col 的长度作为范围的限制可能更加“安全”。

result = [[(*tup, col[i]) for tup in lst[i]] for i in range(len(col))]

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