2016-06-10 2 views
0

Ich erstelle einen Code, wo ich eine Reihe von Wörtern nehmen muss, wandeln Sie es in Zahlen um, wobei hi bye hi hello in 0 1 0 2 umgewandelt werden würde. Ich habe dafür Wörterbücher verwendet und deshalb habe ich Schwierigkeiten im nächsten Teil. Ich muss das dann in eine Textdatei komprimieren, um sie dann wieder zu dekomprimieren und zu einer Zeichenkette zu rekonstruieren. Das ist das Bit, auf das ich gestoßen bin.Wie man ein Wort aus einem Wörterbuch nach seiner Definition nimmt

Die Art und Weise Ich mag es wäre durch Komprimieren des Indizes der Zahlen, so dass die 0 1 0 2 Bit in die Textdatei mit dem Wörterbuchinhalt, also in der Textdatei es 0 1 0 2 und {hi:0, bye:1, hello:3} würde tun.

Nun, was ich diese in die Python-Datei tun möchte zu dekomprimieren oder zu lesen, verwenden, um das Indizes (das ist, wie ich in die 0 1 0 2 ab sofort beziehen), um dann jedes Wort nehme das Wörterbuch aus und rekonstruiere den Satz, also wenn ein kam, würde es in das Wörterbuch schauen und dann finden, was eine 0 Definition hat, dann ziehe das heraus, um in die Zeichenkette zu setzen, also würde es hi finden und das nehmen.

Ich hoffe, dass dies verständlich ist und dass mindestens eine Person weiß, wie es geht, weil ich sicher bin, dass es möglich ist, jedoch konnte ich hier und im Internet nichts finden, das dieses Thema erwähnt.

+0

Was meinen Sie, indem Sie dies in eine Textdatei komprimieren? Sprechen Sie darüber, das Wörterbuch in einer Textdatei zu speichern? – Eular

+0

ja Ich muss das Wörterbuch und die Indexliste des Satzes in die Textdatei schreiben –

+4

Es sieht so aus, als ob Sie wollen, dass wir etwas Code für Sie schreiben. Während viele Benutzer bereit sind, Code für einen in Not geratenen Coder zu produzieren, helfen sie normalerweise nur, wenn das Poster bereits versucht hat, das Problem selbst zu lösen. Eine gute Möglichkeit, diesen Aufwand zu demonstrieren, besteht darin, den Code, den Sie bisher geschrieben haben, die Beispieleingabe (falls vorhanden), die erwartete Ausgabe und die Ausgabe, die Sie tatsächlich erhalten (Konsolenausgabe, Trace-Backs usw.), einzubeziehen. Je mehr Details Sie angeben, desto mehr Antworten erhalten Sie wahrscheinlich. Überprüfen Sie die [FAQ] und [fragen]. –

Antwort

0

TheLazyScripter eine schöne Umgehungslösung für das Problem gab, aber die Laufzeitmerkmale sind, weil für jedes rekonstruierte Wort nicht gut Sie eine Schleife durch die gesamte dict haben.

Ich würde sagen, dass Sie das falsche dict Design gewählt haben: Um effizient zu sein, sollte die Suche in einem Schritt erfolgen, also sollten Sie die Zahlen als Schlüssel und die Wörter als Elemente haben.

Da Ihr Problem wie eine große Informatik Hausaufgaben sieht (ich werde es für meine Schüler ;-) betrachten), werde ich Ihnen nur eine Skizze für die Lösung:

  • Verwendung word in my_dict.values() #(adapt for py2/py3) zu testen ob das Wort bereits im Wörterbuch ist.
  • Wenn nein, insert the next available index als Schlüssel und das Wort als Wert.
  • Sie sind fertig.
  • Für den Satz zu rekonstruieren, nur
    • Schleife durch die Liste von Zahlen
    • die Zahl als Schlüssel in Ihrer dict verwenden und print(my_dict[key])
  • Ausnahme Bereiten Sie sich für den Fall der Handhabung eines Schlüssels nicht in das Diktat (was nicht passieren sollte, wenn Sie den gesamten Prozess kontrollieren, aber es ist eine gute Übung).

Diese Lösung ist viel effizienter als Ihr Ansatz (und einfacher zu implementieren).

0

Ja, Sie können nur normale Dicts und Listen verwenden, um die Daten zu speichern. Und verwenden Sie json oder pickle, um die Daten auf der Festplatte zu speichern.

import pickle 

s = 'hi hello hi bye' 
words = s.split() 
d = {} 
for word in word: 
    if word not in d: 
     d[word] = len(d) 

data = [d[word] for word in words] 

with open('/path/to/file', 'w') as f: 
    pickle.dump({'lookup': d, 'data': data}, f) 

lesen es dann in

with open('/path/to/file', 'r') as f: 
    dic = pickle.load(f) 
    d = d['lookup'] 
reverse_d = {v: k for k, v in d.iteritems()} 
data = d['data'] 
words = [reverse_d[index] for index in data] 
line = ' '.join(words) 
print line 
0

zurück, weil ich nicht genau wissen, wie Sie Ihre keymap erstellt haben das Beste, was ich nur raten tun könnte. Hier habe ich 2 Funktionen erstellt, die verwendet werden können, um eine Zeichenkette in eine txt-Datei basierend auf einer Tastaturbelegung zu schreiben und eine txt-Datei zu lesen und eine Zeichenkette basierend auf einer Tastaturbelegung zurückzugeben. Ich hoffe, das funktioniert für Sie oder gibt Ihnen zumindest ein fundiertes Verständnis für den Prozess! Viel Glück!

import os 

def pack(out_file, string, conversion_map): 
    out_string = '' 
    for word in string.split(' '): 
     for key,value in conversion_map.iteritems(): 
      if word.lower() == value.lower(): 
       out_string += str(key)+' ' 
       break 
     else: 
      out_string += word+' ' 

    with open(out_file, 'wb') as file: 
     file.write(out_string) 

    return out_string.rstrip() 

def unpack(in_file, conversion_map, on_lookup_error=None): 
    if not os.path.exists(in_file): 
     return 

    in_file = ''.join(open(in_file, 'rb').readlines()) 
    out_string = '' 
    for word in in_file.split(' '): 
     for key, value in conversion_map.iteritems(): 
      if word.lower() == str(key).lower(): 
       out_string += str(value)+' ' 
       break 
     else: 
      if on_lookup_error: 
       on_lookup_error() 
      else: 
       out_string += str(word)+' ' 
    return out_string.rstrip() 

def fail_on_lookup(): 
    print 'We failed to find all words in our key map.' 
    raise Exception 

string = 'Hello, my first name is thelazyscripter' 
word_to_int_map = {0:'first', 
        1:'name', 
        2:'is', 
        3:'TheLazyScripter', 
        4:'my'} 

d = pack('data', string, word_to_int_map) #pack and write the data based on the conversion map 

print d #the data that was written to the file 
print unpack('data', word_to_int_map) #here we unpack the data from the file 
print unpack('data', word_to_int_map, fail_on_lookup) 
Verwandte Themen