2017-02-20 4 views
0

ich eine Datei als Wörterbuch Wort habe:Wie die Worte nicht im Wörterbuch überspringen

water=45 
melon=8 
apple=35 
pineapple=67 
I=43 
to=90 
eat=12 
tastes=100 
sweet=21 
it=80 
watermelon=98 
want=70 
juice=88 

und ich habe eine andere Datei mit dem folgenden Text:

I want to eat banana and watermelon 
I want drink juice purple and pineapple 

I ausgegeben werden soll:

43, 70, 90, 12, 98 
43, 70, 88, 67 

Jedes Wort, das nicht im Wörterbuch vorhanden ist, wird übersprungen.

Dies ist, was ich bisher:

import re 
f = open(r'C:\Users\dinesh_pundkar\Desktop\val.txt','r') 
val_dict = {} 
for line in f: 
    k, v = line.strip().split('=') 
    val_dict[k.strip()] = v.strip() 
f.close() 


h = open(r'C:\Users\dinesh_pundkar\Desktop\str_txt.txt','r') 
str_list = [] 
for line in h: 
    str_list.append(str(line).strip()) 



tmp_str = '' 
for val in str_list: 
    tmp_str = val 
    for k in val_dict.keys(): 
      if k in val: 
       replace_str = str(val_dict[k]).strip() + "," 
       tmp_str= re.sub(r'\b{0}\b'.format(k),replace_str,tmp_str,flags=re.IGNORECASE) 

    tmp_str = tmp_str.strip(",") 
    print val, " = ", tmp_str 
    tmp_str = '' 

Ausgang:

43, 70, 90, 12, banana and 98 
43, 70, drink 88, purple and 67 

Antwort

0

Zuerst w E kann Ihre "Wörterbuchdatei" in ein tatsächliches Python-Wörterbuch unter Verwendung eines klugen dict Verständnisses analysieren.

In [1]: dict_file = """water=45 
    ...: melon=8 
    ...: apple=35 
    ...: pineapple=67 
    ...: I=43 
    ...: to=90 
    ...: eat=12 
    ...: tastes=100 
    ...: sweet=21 
    ...: it=80 
    ...: watermelon=98 
    ...: want=70 
    ...: juice=88""" 

In [2]: conversion = {k: int(v) for line in dict_file.split('\n') for (k,v) in (line.split('='),)} 

In [3]: conversion 
Out[3]: 
{'I': 43, 
'apple': 35, 
'eat': 12, 
'it': 80, 
'juice': 88, 
'melon': 8, 
'pineapple': 67, 
'sweet': 21, 
'tastes': 100, 
'to': 90, 
'want': 70, 
'water': 45, 
'watermelon': 98} 

Wir setzen dann die Phrase auf eine Variable.

In [4]: text = "I want to eat banana and watermelon" 

Wir str.split verwenden, um die einzelnen String in eine Liste der Wörter zu ändern.

In [5]: text.split() 
Out[5]: ['I', 'want', 'to', 'eat', 'banana', 'and', 'watermelon'] 

Um zu überprüfen, ob jedes Wort im Wörterbuch conversion ist, dass wir einfach das in Schlüsselwort verwenden können, die Dictionary-Schlüssel überprüft.

In [6]: "banana" in conversion 
Out[6]: False 

In [7]: "watermelon" in conversion 
Out[7]: True 

Wir können dieses Verständnis in einer Liste implementieren nur die Worte zu filtern, die unsere Conversion-Wörterbuch weiß, wie man eine Zahl zu konvertieren.Wir können auch nach dem Wert conversion[word] suchen, von dem wir wissen, dass er existiert, weil wir bereits bestätigt haben, dass das Verständnis nur Werte berücksichtigt, die in der Konvertierung dict sind.

In [9]: [str(conversion[word]) for word in text.split() if word in conversion] 
Out[9]: ['43', '70', '90', '12', '98'] 

Schließlich können wir str.join verwenden diese Liste wieder in einer einzigen Saite zu kombinieren. (Die eckigen Klammern werden entfernt, die die Expression ein Verstehen Generator macht, keine Liste Verständnis, aber es funktioniert in beiden Richtungen.)

In [10]: ', '.join(str(conversion[word]) for word in text.split() if word in conversion) 
Out[10]: '43, 70, 90, 12, 98' 

Erfolg! Sie können diese Methode auf jede der Phrasen in Ihrer Datei über eine einfache for-Schleife anwenden, um das gewünschte Ergebnis zu erhalten.

Hier ist nicht viel Regex erforderlich; Pythons String-Verarbeitungsfunktionen sind sehr leistungsfähig. :)

+0

Ich habe versucht, den Code auszuführen, aber die Ausgabe ist nicht im Ausführen ..., das ist sein Code [Link] (http://www.tutorialspoint.com/execute_python_online.php?PID=0Bw_CjBb95KQMZDI2MDhaV2FZZFE) –

+0

@RiskaNanda Du hast die '...:' 's kopiert, die IPython generiert hat; Wenn Sie sie entfernen, funktioniert es. :) –

+0

Ich habe es gelöscht, aber die Ergebnisse bleiben gleich. [Link] (http://www.tutorialspoint.com/execute_python_online.php?PID=0Bw_CjBb95KQMczl4VXJXTDVYa0U) –

0

Sie können etwas tun list comprehension, um mit der gewünschten Ausgabe zu haben:

I‘ Ich nehme an, Ihre Wörterbuchdatei heißt file1 und Ihre zweite Datei heißt file2.

data1 = [k.rstrip().split("=") for k in open("file1", 'r')] 
data2 = [k.rstrip().split() for k in open("file2", 'r')] 

for k in data2: 
    for j in k: 
     for m in data1: 
      if j == m[0]: 
       print(m[1], end = ' ') 
    print() 

Ausgang:

43 70 90 12 98 
43 70 88 67 
+0

Ich möchte den entsprechenden Satz in Datei2 ausgeben. –

+0

Ich habe meine Antwort aktualisiert. Sie könnten die exakt gewünschte Ausgabe haben. –

1

können Sie dict.get verwenden, die für einen Standardwert ermöglicht es, wenn Sie den Schlüssel nicht finden.

>>> d = {'a': 1, 'b': 2} 
>>> d['c'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'c' 

>>> d.get('c', 'fallback value') 
'fallback value' 

So können Sie so etwas wie:

nums = [dict.get(val, '') for val in str_list] 
# [43, 70, 90, 12, '', '', 98] 

dann die leeren Saiten entfernen mit filter

nums = filter(None, nums) 
# with `None` as the first argument, this removes all elements that eval to False 

bespannen Karte Dann und kommen Sie mit Komma

print(", ".join(map(str, nums))) 
+0

Ich habe einen Fehler: TypeError: Deskriptor 'Get' erfordert ein 'dict' -Objekt aber erhielt eine 'str', Dies ist nicht das Standard-Wörterbuch Python, ich mache ein Wörterbuch manuell in einer Textdatei. –

+0

@RiskaNanda In meinem Code wird davon ausgegangen, dass Sie die Textdatei bereits in einem Wörterbuch verarbeitet haben, wie Sie es bereits in Ihrem eigenen Code getan haben. Ich kann bei Bedarf ein komplettes Beispiel erstellen. –

+0

Ich bin immer noch ein wenig verwirrt, wie man es anwendet. Können Sie ein komplettes Beispiel erstellen? –

Verwandte Themen