2015-06-11 1 views
6

Ich habe die folgenden drei Saiten (sie existieren unabhängig sind aber hier zusammen für Bequemlichkeit angezeigt):Kann ich darauf vertrauen, dass die Reihenfolge eines Diktats bei jeder Iteration gleich bleibt?

from mx2.x.org (mx2.x.org. [198.186.238.144]) 
      by mx.google.com with ESMTPS id g34si6312040qgg.122.2015.04.22.14.49.15 
      (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); 
      Wed, 22 Apr 2015 14:49:16 -0700 (PDT) 

from HQPAMAIL08.x.org (10.64.17.33) by HQPAMAIL13.x.x.org 
(10.34.25.11) with Microsoft SMTP Server (TLS) id 14.2.347.0; Wed, 22 Apr 
2015 17:49:13 -0400 

from HQPAMAIL13.x.org ([fe80::7844:1f34:e8b2:e526]) by 
HQPAMAIL08.iadb.org ([fe80::20b5:b1cb:9c01:aa86%18]) with mapi id 
14.02.0387.000; Wed, 22 Apr 2015 17:49:12 -0400 

Ich suche eine dict zu füllen mit einigen auf dem umgekehrten Basis-Werte (unten nach oben), um von die Saiten. Genauer gesagt extrahiere ich für jede Zeichenfolge die IP-Adresse als einen Index der Arten und dann die vollständige Zeichenfolge als Wert.

Da wichtig ist, habe ich beschlossen, mit Listen zu gehen, und tat zunächst so etwas wie diese (Pseudo-Code, mit dem obenen Bündel von Text):

IPs =[] 
fullStrings =[] 
for string in strings: 
    IPs.append[$theIpAddressFoundInTheString] 
    fullstrings.append[$theWholeString] 

in den folgenden zwei Listen resultierenden (wieder, nur eine Abbildung):

IPs ['198.186.238.144', '10.64.17.33', 'fe80::7844:1f34:e8b2:e526'] 

fullstrings ['from mx2.x.org (mx2.x.org. [198.186.238.144]) 
       by mx.google.com with ESMTPS id g34si6312040qgg.122.2015.04.22.14.49.15 
       (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); 
       Wed, 22 Apr 2015 14:49:16 -0700 (PDT)', 'from HQPAMAIL08.x.org (10.64.17.33) by HQPAMAIL13.x.x.org 
    (10.34.25.11) with Microsoft SMTP Server (TLS) id 14.2.347.0; Wed, 22 Apr 
    2015 17:49:13 -0400', 'from HQPAMAIL13.x.org ([fe80::7844:1f34:e8b2:e526]) by 
    HQPAMAIL08.x.org ([fe80::20b5:b1cb:9c01:aa86%18]) with mapi id 
    14.02.0387.000; Wed, 22 Apr 2015 17:49:12 -0400'] 

Diese feine, bis ein Punkt gearbeitet hat, aber jetzt, da ich in diesen Listen eine dict mit Werten beginnen bevölkern (bei fest codierten Indizes), gegen Werte in anderen Listen zu vergleichen (wieder bei Har dcoded indices), wird nicht nur das Debugging zu einem Problem, der Code wird nicht mehr nachhaltig.

Ich fange an, mit einem Diktat neu zu schreiben (Rückgabe eines Diktats, wo die IP-Adressen die Schlüssel sind und die vollständigen Zeichenfolgen die Werte sind). Dann werde ich Operationen wie ausführen:

for k,v in myDictOfIpsAndStrings: 
    anotherDict[$someHardcodedText] = k 
    anotherDict[$otherHardcodedText] = v   

Hier ist meine Sorge: kann ich sicher sein, dass der dict, zu jeder Zeit es iteriert über, wird immer in der Reihenfolge durchgeführt werden, in dem die dict erstellt wurde? Wenn nicht, ist meine einzige Option, um wieder auf Listen (und die langwierigen und spröde Längenvergleiche, Zuweisungen inhärent, so zu tun) usw.?

Ich weiß, dass ein Diktat von Natur aus unsortiert ist. Und ich kenne die sorted Funktion, aber ich suche nicht, sie nach absteigender/aufsteigender Reihenfolge usw. zu sortieren, sondern es geht darum, (irgendwie) die Reihenfolge beizubehalten, in der das Diktat erstellt wurde.

+1

Verwenden nutzen zu können! – Ryan

+0

Ihre Frage ist unklar. Welche Reihenfolge erwarten Sie zu bewahren? Die Reihenfolge, in der Sie Elemente eingefügt haben? Oder die Reihenfolge, in der Sie iterieren, um nicht zu ändern, wenn Sie mehr als einmal iterieren? Es gibt keine Beibehaltung der Einfügereihenfolge, aber sobald Sie ein Wörterbuch haben, bleibt die Reihenfolge stabil, bis Sie weitere Schlüssel einfügen (oder Schlüssel löschen). –

+0

@minitech Vielen Dank. Die Dokumentation https://docs.python.org/2/library/collections.html#collections.OrderedDict enthält die Zeile "Neu in Version 2.7", aber sie ist in der Mitte der Beschreibung vergraben. Soll ich das lesen, wie OrderedDict in 2.7 neu ist, oder nur die popitem() Methode ist neu? – Pyderman

Antwort

9

kann ich sicher sein, dass das dict bei jeder iteration immer in der reihenfolge ausgeführt wird, in der das dict erstellt wurde?

Nein, ein dict ist ungeordnet, und wird seine Reihenfolge legen, aber die bestimmte Implementierung entscheidet sich dazu.

>>> d = {3: 'c', 2: 'b', 1: 'a'} 
>>> d 
{1: 'a', 2: 'b', 3: 'c'} 

See, unmittelbar nachdem ich die dict erstellt änderte sich die Reihenfolge.

Wenn Sie sicherstellen möchten, dass Sie eine deterministische, steuerbare Ordnung haben, können Sie eine collections.OrderedDict

>>> from collections import OrderedDict 
>>> d = OrderedDict([(3, 'c'), (2, 'b'), (1, 'a')]) 
>>> d 
OrderedDict([(3, 'c'), (2, 'b'), (1, 'a')]) 

Sie noch die OrderedDict in den Konventionen zugreifen können verwendet werden, um

>>> d[3] 
'c' 
>>> d.get(3) 
'c' 

Hinweis dass Sie bei der Erstellung nicht alle Elemente einfügen müssen. Sie können sie einzeln einfügen, wenn Sie möchten.

>>> d = OrderedDict() 
>>> d[3] = 'c' 
>>> d[2] = 'b' 
>>> d[1] = 'a' 
>>> d[4] = 'd' 
>>> d 
OrderedDict([(3, 'c'), (2, 'b'), (1, 'a'), (4, 'd')]) 
+0

Vielleicht möchten Sie "OrderedDict" erwähnen, das, wenn Ihre Interpretation korrekt ist, perfekt zum Anwendungsfall passt. –

4

Sie sollten sich nicht auf die Iterationsreihenfolge eines Diktats verlassen. Die nur Art und Weise Sie eine stabile und wiederholbare Bestellung erhalten können, ist nach wie etwas zu tun:

for key in sorted(yourdict): 
    more code here 

, dass Sie eine stabile Ordnung geben, aber wahrscheinlich nicht das gewünschte ist.

Sie wollen probbaly eine `collections.OrderedDict` ein OrderedDict

+2

Sie können ** sich auf die Iterationsreihenfolge eines Diktats verlassen, sofern Sie nichts einfügen oder löschen. Worauf Sie sich nicht verlassen können, ist, dass der Anzeigenauftrag beibehalten wird. –

+0

@MartijnPieters Ok. Siehe meine Frage oben. Ich denke, ich werde das Diktat auf einmal auffüllen müssen, wenn ich diesen Aspekt nutzen möchte. – Pyderman

+1

@MartijnPieters Danke - das ist ein wichtiger Punkt. Bis jetzt dachte ich, dass es die Iteration von Diktaten war, die die Änderung in der Reihenfolge verursacht hat. – Jesuisme