2016-03-28 15 views
1

Die Idee ist, dass ich eine Zeichenfolge 'vier' bestehend aus 4 Sub-Strings habe. Ich versuche, Wörter aus dem Listenordner zu finden, die ausschließlich mit den 4 Teilzeichenfolgen (Teilmengen) übereinstimmen. Also würde 'paul' passen, aber 'pauls' nicht. Das einzige Problem, das ich habe, ist, dass 'Sets' nicht mit identischen Strings umgehen können. Der Code unten wird "aa" drucken, aber es gibt nur ein a in der Zeichenfolge "vier". Gibt es eine Operation 'issubset' für die Verwendung mit Listen?setzt Operationen auf Listen

four = "laup" 

four = set(four) 

folder = ["paul","joshua","other","asdf","joshua","aa","hello"] 

for word in folder: 
    wordstrings = set(word) 
    if wordstrings.issubset(four): 
      print(word) 

Antwort

2

Wenn Sie möchten, verwenden Sie einen Counter dict die gleichen Zeichen einschließlich Wiederholungen entsprechen die Zeichen in jedem Wort zu zählen:

four = "laup" 
from collections import Counter 
four = Counter(four) 

folder = ["paul","joshua","other","asdf","joshua","aa","hello"] 

for word in folder: 
    wordstrings = Counter(word) 
    if not wordstrings - four: 
      print(word) 

Wenn Sie einen leeren Zähler nach A - B bedeutet es, alle Buchstaben in A erschien zumindest so oft in A, wie sie in B taten

In [14]: Counter("foos") - Counter("foo") 
Out[14]: Counter({'s': 1}) 

In [15]: Counter("foo") - Counter("foos") 
Out[15]: Counter() 

In [16]: Counter("pauls") - Counter("paul") 
Out[16]: Counter({'s': 1}) 

In [17]: Counter("paul") - Counter("paul") 
Out[17]: Counter() 

Sie auch all dafür, dass zumindest als Zeichen in Wortstränge in vier erscheint eine verwenden könnten pp, den Kurzschluss würde wenn man nicht:

for word in folder: 
    wordstrings = Counter(word) 
    if all(wordstrings[k] - four[k] <= 0 for k in wordstrings): 
      print(word) 

Sets werden einfach nicht funktionieren, da alle Elemente sind einzigartig, so wiederholt Zeichen werden als 1.

+0

Vielen Dank Padraic! Große Lösung – JohnPaul

0

Nach bestem Wissen und Gewissen gezählt werden, listet don Ich habe keine Funktion wie eine Untermenge. Sätze entfernen Duplikate immer weg, weil Sie nicht wissen müssen, dass ein Wert dupliziert ist, um zu wissen, dass er in einem Satz existiert. Das Problem hier ist, dass, wenn Sie in der for-Schleife durchlaufen, Wort = 'aa' wird wordstrings = {'a'}, die eine Teilmenge von vier ist. Müssen Sie Set verwenden? Ich hätte nur einen Zähler und konvertiere die Wörter nicht in ein Set.

 four = list(four) #keep it as a workable list instead? 

    for word in folder: 
      n = 0 
      for letter in word: 
       if four.count(letter) != word.count(letter): 
     # iterating through and counting if the letter is not in 
     # both four and word in equal quantities 
        n += 1 
      if n == 0: 
       print(word) 
+0

die Anzahl muss nicht die gleiche sein, um eine Teilmenge zu sein –