次のタプルvalues
があります。
('275', '54000', '0.0', '5000.0', '0.0')
このタプルの最初の値(つまり、)を変更したいのですが275
、タプルは不変であるため機能しvalues[0] = 200
ないことを理解しています。どうすればこれを達成できますか?
次の方法で可能です:
t = ('275', '54000', '0.0', '5000.0', '0.0')
lst = list(t)
lst[0] = '300'
t = tuple(lst)
しかし、何かを変更する必要がある場合は、おそらくそのままにしておく方がよいでしょう。list
さて、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
だから:あなたのタプルが短い場合は、スライスして連結してください。長い場合はリスト変換を!
ワンライナーで可能です:
values = ('275', '54000', '0.0', '5000.0', '0.0')
values = ('300', *values[1:])
これが優れているというわけではありませんが、興味がある場合は、次のように 1 行で実行できます。
tuple = tuple([200 if i == 0 else _ for i, _ in enumerate(tuple)])
編集: これは、エントリが重複しているタプルではまだ機能しません!!
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")
できません。変更したい場合は、タプルの代わりにリストを使用する必要があります。
代わりに、最初の要素として新しい値を持つ新しいタプルを作成できることに注意してください。
私はゲームに遅れていますが、最も簡単で、リソースに優しく、最速の方法(状況によって異なります)は、タプル自体を上書きすることだと思います。これにより、リストと変数の作成が不要になり、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')
これは私がしました:
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]
参照によるコピーを使用してタプルの値を変更できます
>>> tuple1=[20,30,40]
>>> tuple2=tuple1
>>> tuple2
[20, 30, 40]
>>> tuple2[1]=10
>>> print(tuple2)
[20, 10, 40]
>>> print(tuple1)
[20, 10, 40]