Python - 如何更改列表列表中的值?

时间:2012-12-06 20:59:52

标签: python python-2.7

我有一个列表列表,列表中的每个列表包含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,我发现没有任何变化。

8 个答案:

答案 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)