回答:
最初にあなたは尋ねる必要があります、なぜあなたはこれをしたいのですか?
ただし、次の方法で可能です。
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
また、連結メソッドのパフォーマンスは、要素を置き換えるインデックスによって異なります。リスト方式の場合、インデックスは関係ありません。
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:])
values
これで3番目の要素のみをどのように変更しますか?
i = 2; values = (*values[:i], '300', *values[i+1:])
私はこれが技術的に質問に答えると信じていますが、家でこれをしないでください。現時点では、すべての回答には新しいタプルの作成が含まれますが、ctypes
メモリ内でタプルを変更するために使用できます。64ビットシステムでのCPythonのさまざまな実装の詳細に依存して、これを行う1つの方法は次のとおりです。
def modify_tuple(t, idx, new_value):
# `id` happens to give the memory address in CPython; you may
# want to use `ctypes.addressof` instead.
element_ptr = (ctypes.c_longlong).from_address(id(t) + (3 + idx)*8)
element_ptr.value = id(new_value)
# Manually increment the reference count to `new_value` to pretend that
# this is not a terrible idea.
ref_count = (ctypes.c_longlong).from_address(id(new_value))
ref_count.value += 1
t = (10, 20, 30)
modify_tuple(t, 1, 50) # t is now (10, 50, 30)
modify_tuple(t, -1, 50) # Will probably crash your Python runtime
編集:これは重複したエントリを持つタプルではまだ機能しません!!
プーヤのアイデアに基づいて:
これを頻繁に行うことを計画している場合(タプルは理由により不変であるため、これを行うべきではありません)、次のようなことを行う必要があります。
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")
最初に、なぜを変更したいのかを自問してくださいtuple
。Ptyhonで文字列とタプルが不変である理由があります。もしあなたがあなたを変異させたいならtuple
、それはおそらくlist
代わりにあるはずです。
次に、タプルを変更したい場合は、tuple
をa list
に変換してから変換し直し、新しいタプルを同じ変数に再度割り当てることができます。これは、タプルを1回だけ変更する場合に最適です。そうでなければ、個人的には直感に反すると思います。それは本質的には新しいタプルを作成しているので、タプルを変更したい場合は常に変換を実行する必要があるためです。また、コードを読んだ場合、なぜ単にを作成しないのかと考えると混乱するでしょうlist
。しかし、ライブラリを必要としないため、これは素晴らしいことです。
mutabletuple 0.2mutabletuple(typename, field_names, default=MtNoDefault)
からの使用をお勧めします。個人的には、この方法の方が直感的で読みやすいと思います。コードを読んだ個人は、ライターが将来このタプルを変更するつもりであることを知っています。上記の変換方法と比較した場合の欠点は、追加のpyファイルをインポートする必要があることです。list
from mutabletuple import mutabletuple
myTuple = mutabletuple('myTuple', 'v w x y z')
p = myTuple('275', '54000', '0.0', '5000.0', '0.0')
print(p.v) #print 275
p.v = '200' #mutate myTuple
print(p.v) #print 200
TL; DR:変更しようとしないでくださいtuple
。あなたがそうし、それが1回の操作である場合tuple
、リストに変換し、それを変更list
し、新しいtuple
に変えて、oldを保持する変数に再度割り当てtuple
ます 欲望がtuple
あり、どういうわけか回避しlist
、複数回変異させたい場合は、を作成しますmutabletuple
。
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")
古い値の出現をすべて変更します
タプルを編集する最良の方法は、以前のバージョンをベースとして使用してタプルを再作成することです。
これは、明るいバージョンのカラーを作成するために使用した例です(その時点で既に開いていました)。
colour = tuple([c+50 for c in colour])
それが何をするか、それはタプル「カラー」を通過し、各項目を読み取り、それに何かを行い、最後にそれを新しいタプルに追加します。
だからあなたが望むのは次のようなものでしょう:
values = ('275', '54000', '0.0', '5000.0', '0.0')
values = (tuple(for i in values: if i = 0: i = 200 else i = values[i])
その特定のものは機能しませんが、コンセプトは必要なものです。
tuple = (0, 1, 2)
tuple =タプルを反復処理し、必要に応じて各項目を変更します
それがコンセプトです。
私はゲームに遅れましたが、(状況に応じて)最も簡単で、リソースを使いやすく、最も速い方法は、タプル自体を上書きすることだと思います。これにより、リストと変数を作成する必要がなくなり、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')
tldr; 「回避策」は、実際には元のオブジェクトを変更するのではなく、新しいタプルオブジェクトを作成することです。
これは非常に古い質問ですが、誰かがこのPythonの変更タプルの狂気について教えてくれました。私は非常に驚いたり興味をそそられたり、ググリングをしたりして、ここに着陸しました(そして他の同様のサンプルをオンラインで)
私は私の理論を証明するためにいくつかのテストを実行しました
==
値の等価性をis
参照しながら、参照の等価性を注意してください(obj aはobj bと同じインスタンスです)
a = ("apple", "canana", "cherry")
b = tuple(["apple", "canana", "cherry"])
c = a
print("a: " + str(a))
print("b: " + str(b))
print("c: " + str(c))
print("a == b :: %s" % (a==b))
print("b == c :: %s" % (b==c))
print("a == c :: %s" % (a==c))
print("a is b :: %s" % (a is b))
print("b is c :: %s" % (b is c))
print("a is c :: %s" % (a is c))
d = list(a)
d[1] = "kiwi"
a = tuple(d)
print("a: " + str(a))
print("b: " + str(b))
print("c: " + str(c))
print("a == b :: %s" % (a==b))
print("b == c :: %s" % (b==c))
print("a == c :: %s" % (a==c))
print("a is b :: %s" % (a is b))
print("b is c :: %s" % (b is c))
print("a is c :: %s" % (a is c))
収量:
a: ('apple', 'canana', 'cherry')
b: ('apple', 'canana', 'cherry')
c: ('apple', 'canana', 'cherry')
a == b :: True
b == c :: True
a == c :: True
a is b :: False
b is c :: False
a is c :: True
a: ('apple', 'kiwi', 'cherry')
b: ('apple', 'canana', 'cherry')
c: ('apple', 'canana', 'cherry')
a == b :: False
b == c :: True
a == c :: False
a is b :: False
b is c :: False
a is c :: False
これは私がしました:
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]
x = (y)
yをxに割り当てるだけです。