14

リストのリストがあり、リスト内の各リストには 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 を出力すると、何も変わっていないことがわかります。

4

8 に答える 8

17

問題は、リストのコピーを作成し、そのコピーを変更していることです。あなたがしたいことは、元のリストを変更することです。代わりにこれを試してください:

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
于 2012-12-06T21:09:06.540 に答える
3

インデックスを介して割り当てる必要があります。リストのリストがあり、内側のリストにはそれぞれ5つのアイテムがあるとしましょう。それらを繰り返し処理して、各内部リストの 2 番目の項目の値を変更する場合は、次のようにすることができます。

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]]
于 2012-12-06T21:08:33.500 に答える
3

使用できます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

最初の項目が等しい最大 1 つのサブリストを含む#場合のみを削除できます。そうしないと、残りのリスト全体を無駄に循環することになります。execlistmynumber

が実際に一意である場合は、データで他に何をするつもりかによってitemnumbers、辞書または少なくとも を使用したほうがよい場合があります。OrderedDict

于 2012-12-06T21:08:41.187 に答える
1

変数のアンパックは、参照を渡さないように見えますが、値をコピーします。解決策は、次のようにすることです。

foo = [[1, "gggg"], [3, "zzzz"]]

for item in foo:
    item[0] = 2
    item[1] = "ffff"

print(foo)

>>>> [[2, 'ffff'], [2, 'ffff']] 
于 2012-12-06T21:08:36.603 に答える
0

イテレータ変数はオリジナルのコピーです (リストなどの構造は参照によって参照されますが、Python には参照自体の概念はありません)。次のようなことをする必要があります:

for item in execlist:
    if item[0] == mynumber:
        item[1] = ctype
        item[2] = myx
        item[3] = myy
        item[4] = mydelay

itemそれ自体もコピーですが、元のネストされたリストへの参照のコピーであるため、その要素を参照すると元のリストが更新されます。

名前がないので、これはあまり便利ではありません。おそらく、辞書またはクラスの方が便利な構造になるでしょう。

于 2012-12-06T21:22:29.743 に答える
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
于 2012-12-06T21:10:55.650 に答える
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]]
于 2012-12-06T21:21:13.967 に答える