リストとタプルの違い (Pythonで)を勉強していました。明らかなことは、リストは変更可能であるが、タプルは不変(値は初期割り当て後に変更できない)であるということです。
記事の文章が私を手に入れました:
辞書キーとして使用できるのは不変要素のみであるため、キーとして使用できるのはリストではなくタプルのみです。
Tupleを辞書キーとして使用したい状況を考えるのに苦労しています。これが自然で、効率的で、エレガントで、または明白な解決策である問題の例を提供できますか?
編集:
あなたの例をありがとう。これまでのところ、非常に重要なアプリケーションは関数値のキャッシュです。
古典的な例:ポイント値を(x、y)のタプルとして保存したい
_salaries = {}
salaries[('John', 'Smith')] = 10000.0
salaries[('John', 'Parker')] = 99999.0
_
EDIT 1もちろん_salaries['John Smith'] = whatever
_を実行できますが、キーを姓と名に分けるために余分な作業を行う必要があります。 pointColor[(x, y, z)] = "red"
についてはどうですか。ここでは、Tupleキーの利点がより顕著です。
これはベストプラクティスではないことを強調しなければなりません。多くの場合、そのような状況を処理するために特別なクラスを作成する方が良いのですが、アリエータは例を求めて、私は彼女に彼に与えました。
編集
ところで、各Tuple要素もハッシュ可能でなければなりません:
_>>> d = {}
>>> t = (range(3), range(10, 13))
>>> d[t] = 11
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list objects are unhashable
>>>
_
私はタプルをdict
キーとして多くの時間を使用しています。
複数の値から一意のキーを作成する必要がある場合に使用します。
_first_name
_、_last_name
_に基づくキーはkey = '%s_%s'%(first_name, last_name)
になりますが、より良い方法はkey = (first_name, last_name)
です
key = '%s_%s'%(first_name, last_name)
が間違っており、_first_name
_および_last_name
_のすべての値に一意のキーを与えない場合があることです。値に__
_が含まれる場合関数の結果をキャッシュする
_def func(a1, b1):
if (a1,b1) in cache: return cache[(a1,b1)]
...
_
キーを一緒に形成する複数の要素を表示する場合、キーとしてタプルを使用します。
例:{(<x-coordinate>,<y-coordinate>): <indicating letter>}
ここでx-coordinate
またはy-coordinate
を個別に使用する場合、そのポイントを表すことはありません。
ネットワークデバイスを地理的な場所で比較するアプリケーションで、タプルを辞書キーとして使用しました。デバイスは場所ごとに同じ名前が付けられているため、複数の処理中にそのペアリングに一致するデバイスがまだ見つかっているかどうかを知るための自然な方法を提供します。
つまり.
seen = {}
seen[('abc', 'lax')] = 1
seen[('xyz', 'nyc')] = 1
機械学習とディープラーニングのコンテキストでは、最適なハイパーパラメーターをハイパーパラメーター検索する場合、タプルをキーとして使用することは非常に便利です。
learning_rate
、regularization_factor
、およびmodel_complexity
の最適なハイパーパラメーターの組み合わせを検索しているとします。
次に、Pythonで辞書を作成し、これらのhparamsがkeysとvaluesとしてのトレーニングアルゴリズムからの対応する重み行列
hparams_hist = {}
hparams_hist[(0.001, 0.7, 5)] = weight_matrix1
hparams_hist[(0.0001, 0.8, 2)] = weight_matrix2
これらの重み行列は、リアルタイム予測を行うためにさらに必要です。
サーチスペース内のポイントのほぼ一定時間のサーチに使用できます。たとえば、各タプルにいくつかの制約が含まれる可能性がある制約充足問題に使用できます。制約の形式は(v1.v2)で、probなどを色付けするためのcolor(v1)!= color(v2)です。辞書キーとしてタプルを使用すると、順列が制約を満たすかどうかを一定の時間で確認できます。 。
ソートの場合、タプルを使用するメリットがあると思います。たとえば、ディクショナリキーが並べ替えフィールドを表すとします(キーがNone
にならないようにするための既定の並べ替えフィールドがあることは明らかです)。姓、名の順で並べ替える場合など、複数の並べ替えフィールドが必要な場合、辞書キーとしてタプルを使用するのは得策ではありませんか?
確かに、そのようなアイデアは用途が限られているかもしれませんが、それはそれが完全に役に立たないという意味ではありません。
基本的な分析ツールを構築している場合は、ファンネル分析に使用できます。
たとえば、text2にカーソルを合わせた後、image3をクリックした人数をカウントします。
funnels = defaultdict(int)
funnels[('hovered_text2', 'clicked_image3')] += 1
def getHash(Word):
result={}
for i in range(len(Word)):
if Word[i] in result:
result[Word[i]]+=1
else :
result[Word[i]]=1
return Tuple (sorted((result.items())))
def groupAnagrams(words):
resultHash={}
for i in range(len(words)):
s=getHash(words[i].lower())
#print s
if s in resultHash :
l=list(resultHash[s])
l.append(words[i])
resultHash[s] = l # list(resultHash[s]).append(words[i])
else :
resultHash[s]=[words[i]] # Creating list
return resultHash.values()
a[("John", "Doe")] = "123 Fake Street"