In welchem ​​Fall würde ich ein Tupel als Wörterbuchschlüssel verwenden?

77

Ich habe den Unterschied zwischen Listen und Tupeln untersucht (in Python). Eine offensichtliche ist, dass Tupel unveränderlich sind (die Werte können nach der anfänglichen Zuweisung nicht geändert werden), während Listen veränderbar sind.

Ein Satz im Artikel brachte mich:

Nur unveränderliche Elemente können als Wörterbuchschlüssel verwendet werden, und daher können nur Tupel und keine Listen als Schlüssel verwendet werden.

Es fällt mir schwer, an eine Situation zu denken, in der ich ein Tupel als Wörterbuchschlüssel verwenden möchte. Können Sie ein Beispielproblem nennen, bei dem dies die natürliche, effiziente, elegante oder offensichtliche Lösung wäre?

Bearbeiten:

Vielen Dank für Ihre Beispiele. Bisher gehe ich davon aus, dass eine sehr wichtige Anwendung das Zwischenspeichern von Funktionswerten ist.

Escualo
quelle
2
Sie können Tupel verwenden, aber nur solche mit unveränderlichen Elementen. Wenn ein Tupel eine Liste enthält (als eines seiner Elemente), kann ein solches Tupel nicht als Schlüssel verwendet werden. Die Grundregel lautet, dass die Daten (das Tupple) hashbar sein müssen.
Pepr

Antworten:

109

Klassisches Beispiel: Sie möchten den Punktwert als Tupel von (x, y) speichern.

Imran
quelle
4
Beeindruckend. Das ist sehr wahr. Ich kann mir keine andere Möglichkeit vorstellen, die Funktionswerte effizient zu speichern! Wenn die Auswertung Ihrer Funktion sehr teuer ist, tun Sie dies nur einmal und speichern die Punkte für den späteren Abruf. +1! Vielen Dank!
Escualo
4
Einverstanden. Überall dort, wo Sie etwas im Speicher verarbeiten, wo Sie einen zusammengesetzten Schlüssel verwenden würden, um dasselbe in einer relationalen Datenbank zu verarbeiten.
Joe Mabel
Ich implementiere jetzt genau das gleiche Szenario. Wie effizient ist die Suche nach Abrufen? Ist es O (1) oder O (N)?
Shiv
28
salaries = {}
salaries[('John', 'Smith')] = 10000.0
salaries[('John', 'Parker')] = 99999.0

BEARBEITEN 1 Natürlich können Sie dies tun salaries['John Smith'] = whatever, aber dann müssen Sie zusätzliche Arbeit leisten, um den Schlüssel in Vor- und Nachnamen zu unterteilen. Was ist mit pointColor[(x, y, z)] = "red", hier ist der Vorteil der Tupel-Taste stärker ausgeprägt.

Ich muss betonen, dass dies nicht die beste Vorgehensweise ist. In vielen Fällen erstellen Sie besser spezielle Klassen, um mit solchen Situationen umzugehen, aber Arrieta bat um Beispiele, die ich ihr (ihm) gab.

BEARBEITEN 0

Übrigens muss jedes Tupelelement auch hashbar sein:

>>> 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
>>>
Boris Gorelik
quelle
2
Ich benutze Python nicht viel, aber wären die Gehälter [('John Smith')] = 99998 kein gültiger Wörterbuchschlüssel?
GrayWizardx
1
Ich bin damit einverstanden, dass Sie dies tun können, aber ich würde diese Daten mit einer Klasse Employee mit __init __ (self, Firs, Last, Salary) modellieren und für jedes Element in der Liste eine Instanz erstellen. In diesem Fall erscheint es mir etwas unnatürlich, den Trick "Tupel als Schlüssel" zu verwenden. Was denken Sie?
Escualo
1
natürlich würde es. Aber dann müssen Sie zusätzliche Arbeit leisten, wenn Sie den Schlüssel beispielsweise in Vor- und Nachnamen aufteilen möchten.
Boris Gorelik
1
Vielen Dank für Ihre Änderungen, ich denke, das Farbbeispiel ist sehr gut, wie der dict[tuple] = f(tuple)in den Antworten erwähnte General . Ich bin übrigens ein "er" :)
Escualo
4
Beachten Sie, dass Sie keine Klammern benötigen. Tupel werden durch Komma definiert. salaries['John', 'Smith'] = 10000.0würde auch funktionieren :)
Heretron
8

Ich benutze Tupel viel Zeit als dictSchlüssel, z

  • Ich benutze sie, wenn ich einen eindeutigen Schlüssel aus mehreren Werten erstellen muss, z

    basierend auf first_name, last_nameSchlüssel könnte Schlüssel sein = '%s_%s'%(first_name, last_name)aber besserer Weg ist, key = (first_name, last_name)weil

    1. Es ist besser lesbar, kürzer und weniger rechenintensiv
    2. Es ist einfacher, die einzelnen Werte abzurufen
    3. Am wichtigsten key = '%s_%s'%(first_name, last_name)ist, dass es falsch ist und möglicherweise nicht für alle Werte von first_nameund last_namez. B. wenn Werte enthalten eindeutige Schlüssel angeben_
  • Zwischenspeichern der Ergebnisse einer Funktion

    def func(a1, b1):
        if (a1,b1) in cache: return cache[(a1,b1)]
        ...
    
Anurag Uniyal
quelle
5

Ich habe Tupel als Wörterbuchschlüssel in Anwendungen verwendet, die Netzwerkgeräte nach geografischem Standort vergleichen. Da die Geräte für jeden Standort gleich benannt sind, können Sie auf natürliche Weise feststellen, ob bei der Verarbeitung von mehreren Geräten bereits ein Gerät gefunden wurde, das mit dieser Kopplung übereinstimmt.

dh

seen = {}
seen[('abc', 'lax')] = 1
seen[('xyz', 'nyc')] = 1
Nathanismus
quelle
5

Sie verwenden Tupel als Schlüssel, wenn Sie mehrere Elemente anzeigen möchten, die zusammen einen Schlüssel bilden.

Z.B: {(<x-coordinate>,<y-coordinate>): <indicating letter>}

Wenn wir hier x-coordinateoder y-coordinateseparat verwenden, würden wir diesen Punkt nicht darstellen.

Ani Menon
quelle
5

Wenn Sie im Kontext von maschinellem Lernen und tiefem Lernen Hyperparametersuche nach den besten Hyperparametern durchführen , ist die Verwendung von Tupeln als Schlüssel auf jeden Fall sehr nützlich.

Angenommen , Sie haben für die beste Kombination Hyper sind die Suche nach learning_rate, regularization_factorund model_complexity.

Dann können Sie ein Wörterbuch in Python haben, in dem Sie die unterschiedliche Kombination erstellen, die diese hparams als Schlüssel und ihre entsprechenden Gewichtsmatrizen aus dem Trainingsalgorithmus als Werte verwenden können

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

Diese Gewichtsmatrizen werden ferner benötigt, um eine Echtzeitvorhersage zu treffen.

kmario23
quelle
1
Ich mache das oft! Tolles Beispiel.
Ruancomelli
2
a[("John", "Doe")] = "123 Fake Street"
tkerwin
quelle
2

Ich nehme an, im Fall des Sortierens könnte es sinnvoll sein, ein Tupel zu verwenden. Angenommen, der Wörterbuchschlüssel stellt ein Sortierfeld dar (offensichtlich gibt es ein Standardsortierfeld, um zu verhindern, dass der Schlüssel vorhanden ist None). Wenn Sie mehrere Sortierfelder benötigen, z. B. nach Nachname und Vorname, wäre es nicht eine gute Idee, ein Tupel als Wörterbuchschlüssel zu verwenden?

Sicher, eine solche Idee könnte nur begrenzt genutzt werden, aber das bedeutet nicht, dass sie völlig nutzlos ist.

Dustin
quelle
2

Sie können es für die Trichteranalyse verwenden, wenn Sie ein grundlegendes Analysetool erstellen.

Zählen Sie beispielsweise , wie viele Personen nach dem Bewegen des Mauszeigers auf text2 auf das Bild3 geklickt haben.

    funnels = defaultdict(int)
    funnels[('hovered_text2', 'clicked_image3')] += 1
bit2pixel
quelle
2

Sie können es für die ungefähr konstante zeitliche Suche eines Punktes im Suchraum verwenden. Sie können es beispielsweise für das Problem der Einschränkungszufriedenheit verwenden, bei dem jedes Tupel einige Einschränkungen enthalten kann. Die Einschränkung kann die Form (v1.v2) haben, in der Farbe (v1)! = Farbe (v2) zum Färben von Prob usw. ist. Wenn Sie Tupel als Wörterbuchschlüssel verwenden, können Sie in konstanter Zeit feststellen, ob eine Permutation eine Einschränkung erfüllt oder nicht .

Bhavya Ghai
quelle
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()
John
quelle