2016-03-28 1 views
1

L'idée est que j'ai une chaîne «quatre» composée de 4 sous-chaînes. J'essaie de trouver des mots de la liste 'dossier' qui correspondent exclusivement aux 4 sous-chaînes (sous-ensembles). Donc 'paul' correspondrait mais 'pauls' ne le ferait pas. Le seul problème que j'ai, c'est que 'sets' ne peut pas gérer les chaînes identiques. Le code ci-dessous affichera 'aa' mais il n'y en a qu'un dans la chaîne 'quatre'. Y a-t-il une opération 'issubset' disponible pour une utilisation avec des listes?définit les opérations sur les listes

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) 

Répondre

2

Si vous voulez faire correspondre les mêmes caractères, y compris les répétitions utilisent un Counter dict pour compter les caractères de chaque mot:

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) 

Si vous obtenez un compteur vide après A - B cela signifie que toutes les lettres en a est apparu au moins autant de fois en a comme en B:

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() 

Vous pouvez également utiliser all en vous assurant au moins en caractères apparaît dans quatre chaînes de mots un pp qui serait court-circuit si l'on n'a pas:

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

ensembles ne fonctionnera pas que tous les éléments sont uniques caractères si répétés VAUDRA 1.

+0

Merci beaucoup Padraic! Grande solution – JohnPaul

0

Au meilleur de ma connaissance, listes don N'ont pas une fonction comme sous-ensemble. Les ensembles éliminent toujours les doublons car vous n'avez pas besoin de savoir qu'une valeur est dupliquée pour savoir qu'elle existe dans un ensemble. Le problème ici est que lorsque vous itérez à travers dans la boucle for, word = 'aa' devient wordstrings = {'a'} qui est un sous-ensemble de quatre. Devez-vous utiliser ensemble? Je voudrais juste avoir un compteur et ne pas convertir les mots en ensemble.

 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

le nombre ne doit pas être le même pour être un sous-ensemble –