Dict und List Manipulation Python

Ich habe zwei Dateien, die man hat Schlüssel und andere hat sowohl Schlüssel als auch Wert. Ich muss den Schlüssel der Datei einfügen und den entsprechenden Wert aus Datei zwei ziehen. Wenn alle Schlüssel und Wert im einfachen Spaltenformat sind, kann ich den Schlüssel und den Wert auf eine neue Datei sehr gut bekommen. Aber ich verstehe nicht, wie man ein Ergebnis erhält, wenn der Wert im Set / Array-Typ ist.

Eingabe in Spaltenformat:

  • Python - SystemError: NULL Ergebnis ohne Fehler im PyObject-Aufruf
  • Wie konvertiert man eine 1D-Python-Liste mit Bilddaten in ein numpy Array und zeigt es
  • Vectorizing Äußere Schleife der euklidischen Distanz mit numpy auf multidimensionalen Daten
  • Numpy intersect1d mit Array mit Matrix als Elemente
  • Wie mache ich eine benutzerdefinierte Klasse eine Sammlung in Python
  • Rückgabeäquivalent von `:` von der Funktion zum Indexieren von Array
  • 5216 3911 2 761.00 2503 1417 13 102866.00 5570 50 2 3718.00 5391 1534 3 11958.00 5015 4078 1 817.00 3430 299 1 5119.00 4504 3369 2 3218.00 4069 4020 2 17854.00 5164 4163 1 107.00 3589 3026 1 7363.00 

    Eingabe von zwei im Spaltenformat. Sie sind Schlüssel als Paar dh col[0] und col[1] beide sind Schlüssel als Paare

     5391 1534 5015 4078 3430 299 4504 3369 

    Ausgabe für den oben genannten Eingabefall, was für mich richtig ist

     5391 1534 3 11958.00 5015 4078 1 817.00 3430 299 1 5119.00 4504 3369 2 3218.00 

    Programm

     from collections import defaultdict edges = {} with open('Input_1.txt', 'r') as edge_data: for row in edge_data: col = row.strip().split() edges[col[0], col[1]] = col[2], col[3] #Then to do the queries, read through the first file and print out the matches: with open('Input_2', 'r') as classified_data: with open ('Output', 'w') as outfile: for row in classified_data: a,b = row.strip().split() c = edges.get((a,b), edges.get((b,a))) #print a,b, edges.get((a,b), edges.get((b,a))) #print a,b,c outfile.write("%s %s %s\n" % (a,b,c)) 

    Das oben genannte Programm funktioniert hervorragend für die oben genannten Eingabetypen. Aber ich habe keine Ahnung, wie man die Operationen für die unten angegebenen Eingaben bekommt.

    Ich verstehe, dass ich diese Aussage aus dem oben genannten Programm ändern soll, aber ich bekomme keine Ahnung, was sollte das geändert werden?

     edges[col[0], col[1]] = col[2], col[3] 

    Neuer Eingang eins

     ('3350', '2542') [6089.0, 4315.0] ('2655', '1411') [559.0, 1220.0, 166.0, 256.0, 146.0, 528.0, 1902.0, 880.0, 2317.0, 2868.0] ('4212', '1613') [150.0, 14184.0, 4249.0, 1250.0, 10138.0, 4281.0, 2846.0, 2205.0, 1651.0, 335.0, 5233.0, 149.0, 6816.0] ('4750', '2247') [3089.0] ('5305', '3341') [13122.0] 

    Neue Eingabe zwei Sie sind Schlüssel als Paar dh col[0] und col[1] beide sind Schlüssel als Paare

     3350 2542 4750 2247 5305 3341 

    Die erwartete Ausgabe ist

     3350 2542 6089.0 3350 2542 4315.0 4750 2247 3089.0 5305 3341 13122.0 

    3 Solutions collect form web for “Dict und List Manipulation Python”

    Ich dachte, @ drei_pineapples eval Weise ist ganz gut und brillant,

    Hier ist eine Alternative, die nur String manipuliert:

     edges = {} with open("Input_1.txt", "r") as edge_data: for row in edge_data: k, v = row.strip().split(")") # split as key, value k = " ".join(i.strip("'") for i in k.strip("(").split(", ")) # clean unwanted symbol and merge together v = v.strip(" []").split(", ") # get list value edges[k] = v with open("Input_2", "r") as classified_data: for row in classified_data: k = row.strip(); for v in edges.get(k, []): print k, v 

    Verwenden Sie Muster Matching

     import re rec = re.compile(r"\('(\d+)',\s*'(\d+)'\)\s*\[(.*)\]") matches = rec.match("('3350', '2542') [6089.0, 4315.0]") print matches.groups() print int(matches.group(1)) print int(matches.group(2)) print map(float, matches.group(3).split(',')) 

    Der Ausgang ist

     ('3350', '2542', '6089.0, 4315.0') 3350 2542 [6089.0, 4315.0] 

    Um die Daten zu speichern

     a = int(matches.group(1)) b = int(matches.group(2)) data = map(float, matches.group(3).split(',')) edges[a,b] = data 

    Um Daten zu erhalten und die Ausgabe zu drucken

     c = edges.get((a,b), edges.get((b,a))) for value in c: print "%s %s %s\n" % (a,b, value) 

    Ich würde vorschlagen, die Schnur auf eine andere caharacter zu teilen, sagen ')'

    So machst du so etwas wie:

     with open('Input_1.txt', 'r') as edge_data: for row in edge_data: col = row.strip().split(')') 

    Sie wollen dann die String-Darstellung eines Tupels und einer Liste in etwas umwandeln, mit dem Sie arbeiten können. Sie können dies tun, indem Sie eval()

      key = eval(col[0]+')') # note I add the bracket back in that we split on value = eval(col[1]) edges[key] = value 

    Sie haben jetzt ein Wörterbuch edges mit Schlüsseln, die das Tupel in Datei eins und Werte, die die zugehörigen Listen enthalten passen

    Wenn Sie in Datei 2 lesen, müssen Sie eine weitere Schleife hinzufügen, die über die Einträge in der Liste iteriert. Zum Beispiel so etwas wie

     for c in edges[(a,b)]: outfile.write("%s %s %s\n" % (a,b,c)) 

    Dies ermöglicht es Ihnen, eine Zeile zu Ihrer Ausgabedatei für jeden Eintrag in der Liste, die Sie lesen, aus der ersten Datei zu schreiben.

    Python ist die beste Programmiersprache der Welt.