我有一个列表列表,列表中的每个列表包含5个项目,如何更改列表中项目的值?我尝试过以下方法:
for [itemnumber, ctype, x, y, delay] in execlist:
if itemnumber == mynumber:
ctype = myctype
x = myx
y = myy
delay = mydelay
最初我有一个元组列表,但我意识到我无法更改元组中的值,所以我切换到列表,但我仍然无法更改任何值。如果我在for循环中打印ctype,x,y,delay,myctype,myx,myy或mydelay,似乎一切正常,但如果我之后打印execlist,我发现没有任何变化。
答案 0 :(得分:13)
问题是您正在创建列表的副本,然后修改副本。你想要做的是修改原始列表。试试这个:
for i in range(len(execlist)):
if execlist[i][0] == mynumber:
execlist[i][1] = myctype
execlist[i][2] = myx
execlist[i][3] = myy
execlist[i][4] = mydelay
答案 1 :(得分:2)
您需要通过索引进行分配。假设你有一个列表列表,其中内部列表各有5个项目,就像你描述的那样。如果你想迭代它们并改变每个内部列表中第二项的值,你可以这样做:
l = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]
for i in l:
i[1] = "spam"
print l
(output) [[0, "spam", 2, 3, 4], [5, "spam", 7, 8, 9], [10, "spam", 12, 13, 14]]
答案 2 :(得分:2)
您可以使用enumerate()
:
for index, sublist in enumerate(execlist):
if sublist[0] == mynumber:
execlist[index][1] = myctype
execlist[index][2] = myx
execlist[index][3] = myy
execlist[index][4] = mydelay
# break
如果#
最多只包含一个第一项可以等于execlist
的子列表,则可以删除mynumber
;否则,你将在列表的其余部分无用地循环。
如果itemnumbers
实际上是唯一的,那么您最好使用字典或至少OrderedDict
,这取决于您打算对数据做什么。
答案 3 :(得分:0)
变量解包似乎没有通过引用但复制值。 解决方案就是这样做:
foo = [[1, "gggg"], [3, "zzzz"]]
for item in foo:
item[0] = 2
item[1] = "ffff"
print(foo)
>>>> [[2, 'ffff'], [2, 'ffff']]
答案 4 :(得分:0)
不要在列表中分配局部变量。在循环中
for i in lis:
i = 5
只需将变量i
设置为5,并保持列表的实际内容不变。相反,您必须直接分配它:
for i in range(len(lis)):
lis[i] = 5
同样适用于列表列表,尽管在这种情况下不必分配局部变量,因此您可以使用for...in
构造。
for i in listoflists:
for i2 in range(len(i)):
i[i2] = 5 #sets all items in all lists to 5
答案 5 :(得分:0)
更改for
中指定的变量不会更改列表。这是一种可行的方式来做你想做的事情:
execlist = [
#itemnumber, ctype, x, y, delay
[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
]
mynumber, myctype, myx, myy, mydelay = 6, 100, 101, 102, 104
for i, sublist in enumerate(execlist):
if sublist[0] == mynumber:
execlist[i] = [mynumber, myctype, myx, myy, mydelay]
print execlist
输出:
[[1, 2, 3, 4, 5], [6, 100, 101, 102, 104], [11, 12, 13, 14, 15]]
答案 6 :(得分:0)
迭代器变量是原始的副本(Python没有这样的引用概念,尽管列表之类的结构通过引用引用)。您需要执行以下操作:
for item in execlist:
if item[0] == mynumber:
item[1] = ctype
item[2] = myx
item[3] = myy
item[4] = mydelay
item
本身也是一个副本,但它是对原始嵌套列表的引用的副本,因此当您引用其元素时,原始列表会更新。
由于你没有名字,这不方便;也许字典或类是一个更方便的结构。
答案 7 :(得分:0)
这是我最近使用的一个示例,它是一个真正的弯心人,但希望它能帮上一些忙!
pivot_peaks是熊猫数据帧的列表,其中一些是重复的。
# Create a new list with only a single entry for each item
new_list = []
for obj_index, obj in enumerate(pivot_peaks):
add_new_frame = False
if len(new_list) == 0:
new_list.append(obj)
else:
for item in new_list:
if item.equals(obj):
add_new_frame = False
break
else:
add_new_frame = True
if add_new_frame == True:
new_list.append(obj)