157

次のタプルvaluesがあります。

('275', '54000', '0.0', '5000.0', '0.0')

このタプルの最初の値(つまり、)を変更したいのですが275、タプルは不変であるため機能しvalues[0] = 200ないことを理解しています。どうすればこれを達成できますか?

4

17 に答える 17

215

次の方法で可能です:

t = ('275', '54000', '0.0', '5000.0', '0.0')
lst = list(t)
lst[0] = '300'
t = tuple(lst)

しかし、何かを変更する必要がある場合は、おそらくそのままにしておく方がよいでしょう。list

于 2012-07-12T18:29:29.503 に答える
26

さて、Trufa が既に示したように、特定のインデックスでタプルの要素を置き換えるには、基本的に 2 つの方法があります。タプルをリストに変換するか、要素を置き換えて元に戻すか、連結によって新しいタプルを構築します。

In [1]: def replace_at_index1(tup, ix, val):
   ...:     lst = list(tup)
   ...:     lst[ix] = val
   ...:     return tuple(lst)
   ...:

In [2]: def replace_at_index2(tup, ix, val):
   ...:     return tup[:ix] + (val,) + tup[ix+1:]
   ...:

では、どちらの方法が優れているか、つまりより速いのでしょうか?

短いタプル (Python 3.3) の場合、連結の方が実際には高速であることがわかります!

In [3]: d = tuple(range(10))

In [4]: %timeit replace_at_index1(d, 5, 99)
1000000 loops, best of 3: 872 ns per loop

In [5]: %timeit replace_at_index2(d, 5, 99)
1000000 loops, best of 3: 642 ns per loop

しかし、より長いタプルを見ると、リスト変換が適しています:

In [6]: k = tuple(range(1000))

In [7]: %timeit replace_at_index1(k, 500, 99)
100000 loops, best of 3: 9.08 µs per loop

In [8]: %timeit replace_at_index2(k, 500, 99)
100000 loops, best of 3: 10.1 µs per loop

非常に長いタプルの場合、リスト変換の方が大幅に優れています!

In [9]: m = tuple(range(1000000))

In [10]: %timeit replace_at_index1(m, 500000, 99)
10 loops, best of 3: 26.6 ms per loop

In [11]: %timeit replace_at_index2(m, 500000, 99)
10 loops, best of 3: 35.9 ms per loop

また、連結メソッドのパフォーマンスは、要素を置き換えるインデックスに依存します。list メソッドの場合、インデックスは関係ありません。

In [12]: %timeit replace_at_index1(m, 900000, 99)
10 loops, best of 3: 26.6 ms per loop

In [13]: %timeit replace_at_index2(m, 900000, 99)
10 loops, best of 3: 49.2 ms per loop

だから:あなたのタプルが短い場合は、スライスして連結してください。長い場合はリスト変換を!

于 2013-11-23T10:14:10.897 に答える
15

ワンライナーで可能です:

values = ('275', '54000', '0.0', '5000.0', '0.0')
values = ('300', *values[1:])
于 2018-10-05T03:21:34.263 に答える
9

これが優れているというわけではありませんが、興味がある場合は、次のように 1 行で実行できます。

tuple = tuple([200 if i == 0 else _ for i, _ in enumerate(tuple)])
于 2016-11-11T19:28:42.140 に答える
3

編集: これは、エントリが重複しているタプルではまだ機能しません!!

Pooya のアイデアに基づいて:

これを頻繁に行う予定がある場合 (タプルは何らかの理由で不変であるため、そうすべきではありません)、次のようにする必要があります。

def modTupByIndex(tup, index, ins):
    return tuple(tup[0:index]) + (ins,) + tuple(tup[index+1:])

print modTupByIndex((1,2,3),2,"a")

またはジョンのアイデアに基づいて:

def modTupByIndex(tup, index, ins):
    lst = list(tup)
    lst[index] = ins
    return tuple(lst)

print modTupByIndex((1,2,3),1,"a")
于 2012-07-12T18:58:33.677 に答える
2

Jonの Idea と 親愛なるTrufaに 基づく

def modifyTuple(tup, oldval, newval):
    lst=list(tup)
    for i in range(tup.count(oldval)):
        index = lst.index(oldval)
        lst[index]=newval

    return tuple(lst)

print modTupByIndex((1, 1, 3), 1, "a")

古い値の出現をすべて変更します

于 2012-07-12T18:37:22.873 に答える
1

できません。変更したい場合は、タプルの代わりにリストを使用する必要があります。

代わりに、最初の要素として新しい値を持つ新しいタプルを作成できることに注意してください。

于 2012-07-12T18:29:58.263 に答える
0

私はゲームに遅れていますが、最も簡単で、リソースに優しく、最速の方法(状況によって異なります)は、タプル自体を上書きすることだと思います。これにより、リストと変数の作成が不要になり、1 行でアーカイブされます。

new = 24
t = (1, 2, 3)
t = (t[0],t[1],new)

>>> (1, 2, 24)

ただし: これはかなり小さなタプルの場合にのみ便利で、タプルの固定値に制限されますが、とにかくほとんどの場合、これはタプルの場合です。

したがって、この特定のケースでは、次のようになります。

new = '200'
t = ('275', '54000', '0.0', '5000.0', '0.0')
t = (new, t[1], t[2], t[3], t[4])

>>> ('200', '54000', '0.0', '5000.0', '0.0')
于 2019-09-01T12:49:34.293 に答える
-2

これは私がしました:

list = [1,2,3,4,5]
tuple = (list)

変更するには、ただ行うだけです

list[0]=6

タプルを変更できます:D

これはIDLEから正確にコピーされたものです

>>> list=[1,2,3,4,5,6,7,8,9]

>>> tuple=(list)

>>> print(tuple)

[1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> list[0]=6

>>> print(tuple)

[6, 2, 3, 4, 5, 6, 7, 8, 9]
于 2014-11-01T21:11:33.917 に答える
-5

参照によるコピーを使用してタプルの値を変更できます

>>> tuple1=[20,30,40]

>>> tuple2=tuple1

>>> tuple2
    [20, 30, 40]

>>> tuple2[1]=10

>>> print(tuple2)
    [20, 10, 40]

>>> print(tuple1)
    [20, 10, 40]
于 2018-10-02T14:54:52.480 に答える