2016-10-21 1 views
3

So habe ich eine Liste von Zeichenketten wie folgt:Python - eine Iteration durch eine Liste von Strings und Gruppenteil passende Strings

list = ["I love cat", "I love dog", "I love fish", "I hate banana", "I hate apple", "I hate orange"] 

Wie kann ich durch die Liste und die Gruppe teilweise passenden Strings ohne gegebene Schlüsselwörter laufen. Das Ergebnis sollte wie folgt aussehen:

list 1 = [["I love cat","I love dog","I love fish"],["I hate banana","I hate apple","I hate orange"]] 

Vielen Dank.

+0

Was haben Sie schon versucht? Irgendein Startcode, damit andere wissen, was du bereits versucht hast und wo du stecken geblieben bist, ist hilfreich bei der Gestaltung von Antworten. – TheF1rstPancake

+0

['itertools groupby'] (https://docs.python.org/2/library/itertools.html#itertools.groupby) wird hilfreich sein. – RoadRunner

+0

Wie definieren Sie eine teilweise Übereinstimmung? – wwii

Antwort

0

Vermeiden Sie Wörter wie list bei der Benennung Ihrer Variablen. Auch list 1 ist keine gültige Python-Variable.

Versuchen Sie folgendes:

import sys 
from itertools import groupby 

#Assuming you group by the first two words in each string, e.g. 'I love', 'I hate'. 

L = ["I love cat", "I love dog", "I love fish", "I hate banana", "I hate apple", "I hate orange"] 

L = sorted(L) 

result = [] 

for key,group in groupby(L, lambda x: x.split(' ')[0] + ' ' + x.split(' ')[1]): 
    result.append(list(group)) 

print(result) 
+2

'' 'sorted''' gibt einen Wert zurück, aber Sie weisen ihn keinem zu. Verwenden Sie stattdessen list.sort() anstelle von In-Place-Sortierung. – wwii

0

Sie können versuchen, diesen Ansatz. Obwohl es nicht der beste Ansatz ist, ist es hilfreich, das Problem methodischer zu verstehen.

from itertools import groupby 

my_list = ["I love cat","I love dog","I love fish","I hate banana","I hate apple","I hate orange"]; 

each_word = sorted([x.split() for x in my_list]) 

# I assumed the keywords would be everything except the last word 
grouped = [list(value) for key, value in groupby(each_word, lambda x: x[:-1])] 

result = [] 
for group in grouped: 
    temp = [] 
    for i in range(len(group)): 
     temp.append(" ".join(group[i])) 
    result.append(temp) 

print(result) 

Ausgang:

[['I hate apple', 'I hate banana', 'I hate orange'], ['I love cat', 'I love dog', 'I love fish']] 
+0

Sie sollten wahrscheinlich sicherstellen, dass das iterable vor der Verwendung von itertools.groupby() sortiert ist. – wwii

+0

Ja, das stimmt @wwii. Danke für den Vorschlag, ich werde das beheben.Ich erkannte auch, dass die Hälfte des Codes nicht notwendig ist, und es kann verbessert werden. – RoadRunner

+0

Was halten Sie auch für eine Teilübereinstimmung? – RoadRunner

3

Versuchen einen inversen Index bauen, und dann können Sie wählen, je nachdem, welche Keywords, die Sie mögen. Dieser Ansatz ignoriert Wortfolge:

index = {} 
for sentence in sentence_list: 
    for word in set(sentence.split()): 
     index.setdefault(word, set()).add(sentence) 

Oder Dieser Ansatz, der Schlüssel der Index von allen möglichen Vollwortphrase Präfixe:

index = {} 
for sentence in sentence_list: 
    number_of_words = length(sentence.split()) 
    for i in xrange(1, number_of_words): 
     key_phrase = sentence.rsplit(maxsplit=i)[0] 
     index.setdefault(key_phrase, set()).add(sentence) 

Und dann, wenn Sie alle Sätze finden möchten, die enthalten ein Schlüsselwort (oder mit einem Satz beginnen, wenn das Ihr Index ist):

match_sentences = index[key_term] 

oder eine bestimmte Gruppe von Keywords:

matching_sentences = reduce(list_of_keywords[1:], lambda x, y: x & index[y], initializer = index[list_of_keywords[0]]) 

Jetzt können Sie eine Liste nach fast jeder Kombination von Begriffen oder Wortgruppen gruppieren, indem Sie ein Listenverständnis erstellen, indem Sie diese Indizes verwenden, um Sätze zu generieren. Zum Beispiel, wenn Sie den Satz Präfix Index und wollen alles durch die ersten beiden Wortphrase gruppiert gebaut:

return [list(index[k]) for k in index if len(k.split()) == 2] 
1

Sequenz Matcher die Aufgabe für Sie tun. Stimmen Sie das Score-Verhältnis für bessere Ergebnisse ab.

Versuchen Sie folgendes:

from difflib import SequenceMatcher 
sentence_list = ["I love cat", "I love dog", "I love fish", "I hate banana", "I hate apple", "I hate orange"] 
result=[] 
for sentence in sentence_list: 
    if(len(result)==0): 
     result.append([sentence]) 
    else: 
     for i in range(0,len(result)): 
      score=SequenceMatcher(None,sentence,result[i][0]).ratio() 
      if(score<0.5): 
       if(i==len(result)-1): 
        result.append([sentence]) 
      else: 
       if(score != 1): 
        result[i].append(sentence) 

Ausgang:

[['I love cat', 'I love dog', 'I love fish'], ['I hate banana', 'I hate apple', 'I hate orange']] 
Verwandte Themen