在 Python3 的循环中附加到列表(再次)

Appending to lists within loops in Python3 (again)

提问人:zazizoma 提问时间:2/8/2023 最后编辑:phozazizoma 更新时间:2/8/2023 访问量:53

问:

我很难以迭代方式添加到列表中。

这是一个 MWE:

# Given a nested list of values, or sets
sets = [[1, 2, 3], [1, 2, 4], [1, 2, 5]]
    
# add a value to each sublist giving the number of that set in the list.
n_sets = len(sets)
for s in range(n_sets):
    (sets[s]).insert(0, s)

# Now repeat those sets reps times
reps = 4
expanded_sets = [item for item in sets for i in range(reps)]

# then assign a repetition number to each occurance of a set.
rep_list = list(range(reps)) * n_sets
for i in range(n_sets * reps):
    (expanded_sets[i]).insert(0, rep_list[i])
    
expanded_sets

哪个返回

[[3, 2, 1, 0, 0, 1, 2, 3],
 [3, 2, 1, 0, 0, 1, 2, 3],
 [3, 2, 1, 0, 0, 1, 2, 3],
 [3, 2, 1, 0, 0, 1, 2, 3],
 [3, 2, 1, 0, 1, 1, 2, 4],
 [3, 2, 1, 0, 1, 1, 2, 4],
 [3, 2, 1, 0, 1, 1, 2, 4],
 [3, 2, 1, 0, 1, 1, 2, 4],
 [3, 2, 1, 0, 2, 1, 2, 5],
 [3, 2, 1, 0, 2, 1, 2, 5],
 [3, 2, 1, 0, 2, 1, 2, 5],
 [3, 2, 1, 0, 2, 1, 2, 5]]

而不是想要的

[[0, 0, 1, 2, 3],
 [1, 0, 1, 2, 3],
 [2, 0, 1, 2, 3],
 [3, 0, 1, 2, 3],
 [0, 1, 1, 2, 4],
 [1, 1, 1, 2, 4],
 [2, 1, 1, 2, 4],
 [3, 1, 1, 2, 4],
 [0, 2, 1, 2, 5],
 [1, 2, 1, 2, 5],
 [2, 2, 1, 2, 5],
 [3, 2, 1, 2, 5]]

只是为了好玩,第一个循环返回的期望值为sets

[[0, 1, 2, 3], [1, 1, 2, 4], [2, 1, 2, 5]]

但是在第二个循环更改为sets

[[3, 2, 1, 0, 0, 1, 2, 3], [3, 2, 1, 0, 1, 1, 2, 4], [3, 2, 1, 0, 2, 1, 2, 5]]

我怀疑这个问题与副本和参考资料有关。我尝试在各个地方添加和切片,但是对于索引子列表,我还没有遇到有效的组合。我正在运行 Python 3.10.6。.copy()

感谢您的观看!

根据建议的解决方案,不能正确替换 ,因为它给出了而不是 所需的.我是否需要展平,或者是否有带有符号的语法可以给我一个列表?[list(range(reps)) for _ in range(n_sets)]list(range(reps)) * n_sets[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]][0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]_

进一步更新 . . . 取代

rep_list = list(range(reps)) * n_sets

rep_list_nest = [list(range(reps)) for _ in range(n_sets)]
rep_list = [i for sublist in rep_list_nest for i in sublist]

给出了相同的不良结果。expanded_sets

python python-3.x 附加 嵌套列表

评论

0赞 pho 2/8/2023
这回答了你的问题吗?列表列表意外地反映在子列表中
0赞 zazizoma 2/8/2023
也许,这意味着问题出在 * n_sets而不是插件中,我认为这是。但是,不清楚如何应用您链接到此的符号中的 _ 符号。
1赞 zazizoma 2/8/2023
经过进一步的探索,不,它没有,尽管它可能是解决方案的一部分。

答:

1赞 pho 2/8/2023 #1

问题出在这里:

expanded_sets = [item 
                 for item in sets
                 for i in range(reps)]

此列表现在包含连续四次的相同元素,然后是重复四次的下一个元素,依此类推。sets

创建副本可修复以下问题:item

expanded_sets = [item.copy() 
                 for item in sets
                 for i in range(reps)]

在线试用

如果你想要一个更pythonic的方法,那么要认识到结果是两个范围的乘积,而你的原始范围都是连接在一起的:sets

from itertools import product

sets = [[1, 2, 3], [1, 2, 4], [1, 2, 5]]

expanded_sets = [[inner_counter, outer_counter] + sets_elem
                  for sets_elem, outer_counter, inner_counter in product(sets, range(len(sets)), range(4))]

在线试用

评论

0赞 zazizoma 2/8/2023
哦,太好了,谢谢。这是有道理的。我知道我需要在某个地方复制,但无法弄清楚确切的位置。