web-dev-qa-db-ja.com

どのような場合、辞書キーとしてタプルを使用しますか?

リストとタプルの違い (Pythonで)を勉強していました。明らかなことは、リストは変更可能であるが、タプルは不変(値は初期割り当て後に変更できない)であるということです。

記事の文章が私を手に入れました:

辞書キーとして使用できるのは不変要素のみであるため、キーとして使用できるのはリストではなくタプルのみです。

Tupleを辞書キーとして使用したい状況を考えるのに苦労しています。これが自然で、効率的で、エレガントで、または明白な解決策である問題の例を提供できますか?

編集:

あなたの例をありがとう。これまでのところ、非常に重要なアプリケーションは関数値のキャッシュです。

60
Escualo

古典的な例:ポイント値を(x、y)のタプルとして保存したい

94
Imran
_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
>>>
_
25
Boris Gorelik

私はタプルをdictキーとして多くの時間を使用しています。

  • 複数の値から一意のキーを作成する必要がある場合に使用します。

    _first_name_、_last_name_に基づくキーはkey = '%s_%s'%(first_name, last_name)になりますが、より良い方法はkey = (first_name, last_name)です

    1. 読みやすく、短く、計算量が少ない
    2. 個々の値を取得する方が簡単です
    3. 最も重要なのは、key = '%s_%s'%(first_name, last_name)が間違っており、_first_name_および_last_name_のすべての値に一意のキーを与えない場合があることです。値に___が含まれる場合
  • 関数の結果をキャッシュする

    _def func(a1, b1):
        if (a1,b1) in cache: return cache[(a1,b1)]
        ...
    _
8
Anurag Uniyal

キーを一緒に形成する複数の要素を表示する場合、キーとしてタプルを使用します。

例:{(<x-coordinate>,<y-coordinate>): <indicating letter>}

ここでx-coordinateまたはy-coordinateを個別に使用する場合、そのポイントを表すことはありません。

5
Ani Menon

ネットワークデバイスを地理的な場所で比較するアプリケーションで、タプルを辞書キーとして使用しました。デバイスは場所ごとに同じ名前が付けられているため、複数の処理中にそのペアリングに一致するデバイスがまだ見つかっているかどうかを知るための自然な方法を提供します。

つまり.

seen = {}
seen[('abc', 'lax')] = 1
seen[('xyz', 'nyc')] = 1
4
jathanism

機械学習とディープラーニングのコンテキストでは、最適なハイパーパラメーターをハイパーパラメーター検索する場合、タプルをキーとして使用することは非常に便利です。

learning_rateregularization_factor、およびmodel_complexityの最適なハイパーパラメーターの組み合わせを検索しているとします。

次に、Pythonで辞書を作成し、これらのhparamsがkeysvaluesとしてのトレーニングアルゴリズムからの対応する重み行列

hparams_hist = {}
hparams_hist[(0.001, 0.7, 5)] = weight_matrix1
hparams_hist[(0.0001, 0.8, 2)] = weight_matrix2

これらの重み行列は、リアルタイム予測を行うためにさらに必要です。

2
kmario23

サーチスペース内のポイントのほぼ一定時間のサーチに使用できます。たとえば、各タプルにいくつかの制約が含まれる可能性がある制約充足問題に使用できます。制約の形式は(v1.v2)で、probなどを色付けするためのcolor(v1)!= color(v2)です。辞書キーとしてタプルを使用すると、順列が制約を満たすかどうかを一定の時間で確認できます。 。

2
Bhavya Ghai

ソートの場合、タプルを使用するメリットがあると思います。たとえば、ディクショナリキーが並べ替えフィールドを表すとします(キーがNoneにならないようにするための既定の並べ替えフィールドがあることは明らかです)。姓、名の順で並べ替える場合など、複数の並べ替えフィールドが必要な場合、辞書キーとしてタプルを使用するのは得策ではありませんか?

確かに、そのようなアイデアは用途が限られているかもしれませんが、それはそれが完全に役に立たないという意味ではありません。

2
Dustin

基本的な分析ツールを構築している場合は、ファンネル分析に使用できます。

たとえば、text2にカーソルを合わせた後、image3をクリックした人数をカウントします。

    funnels = defaultdict(int)
    funnels[('hovered_text2', 'clicked_image3')] += 1
1
bit2pixel
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()
1
John
a[("John", "Doe")] = "123 Fake Street"
1
tkerwin