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.
quelle
Antworten:
Klassisches Beispiel: Sie möchten den Punktwert als Tupel von (x, y) speichern.
quelle
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 mitpointColor[(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 >>>
quelle
dict[tuple] = f(tuple)
in den Antworten erwähnte General . Ich bin übrigens ein "er" :)salaries['John', 'Smith'] = 10000.0
würde auch funktionieren :)Ich benutze Tupel viel Zeit als
dict
Schlüssel, zIch benutze sie, wenn ich einen eindeutigen Schlüssel aus mehreren Werten erstellen muss, z
basierend auf
first_name
,last_name
Schlüssel könnte Schlüssel sein ='%s_%s'%(first_name, last_name)
aber besserer Weg ist,key = (first_name, last_name)
weilkey = '%s_%s'%(first_name, last_name)
ist, dass es falsch ist und möglicherweise nicht für alle Werte vonfirst_name
undlast_name
z. 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)] ...
quelle
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
quelle
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-coordinate
odery-coordinate
separat verwenden, würden wir diesen Punkt nicht darstellen.quelle
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_factor
undmodel_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.
quelle
a[("John", "Doe")] = "123 Fake Street"
quelle
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.
quelle
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
quelle
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 .
quelle
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()
quelle