2011-10-08 5 views
0

J'ai un code qui ressemble à ceci:chaîne Python comparer question

valid = set() 
    for string in substrings: 
     for line in dictionary_words: 
      if string in line: 
       valid.add(string) 
    f.writelines(sorted(valid)) 

Les deux dictionary_words et sont sous-chaînes contient présentement.

Après que le substring se trouve à l'intérieur de dictionary_words, il devrait simplement aller de l'avant et passer au substring suivant.

Quelle est la meilleure façon d'écrire cela?

+1

@ F.C .: pourquoi ne pas afficher ceci comme réponse, puisque c'est exactement ce que l'O.P demande? –

Répondre

2
valid = set() 
for string in substrings: 
    for line in dictionary_words: 
     if string in line: 
      valid.add(string) 
      break 
f.writelines(sorted(valid)) 

@ F.C .: Si vous utilisez continue au lieu de break, elle se déroulera la prochaine itération de la boucle intérieure pour-.

+0

L'utilisation de 'break' passerait-elle à la prochaine "ligne dans dictionary_words" ou à la prochaine "chaîne dans les sous-chaînes"? – some1

+1

S'il y avait une instruction sur le même niveau d'indentation que 'for line in ... 'après break, elle sauterait là. Mais comme il n'y a rien, il continuerait avec la 'chaîne dans les sous-chaînes' suivante – Orangenhain

+1

@Srikar: Je pense que faire un dictionnaire, et utiliser 'dictionary_of_dictionary_words.has_key (string)' ne fonctionnerait pas, car 'string in line' fait de la sous-chaîne correspondant, et has_key ne fonctionne pas. Ou peut-être qu'il me manque quelque chose. – Orangenhain

1

Pourquoi ne pas essayer cela -

valid = set() 
    for string in substrings: 
     if dictionary_words.has_key(string): 
      valid.add(string) 
    f.writelines(sorted(valid)) 

Il n'y a pas besoin de supplément pour boucle dans la principale boucle. Cette has_key résout votre problème de passer à la sous-chaîne suivante est string n'est pas dans dictionary_word.

espérons que cette aide ...

+0

dictionary_words est une liste, bien que je pourrais probablement faire un tuple. – some1

+0

fait de 'dictionary_words' un' dict() '. Puisque vous êtes intéressé par la recherche, ce sera beaucoup plus rapide qu'une liste ou un tuple –

+0

dictionary_words était une liste, bien que je pourrais probablement en faire un dictionnaire. Désolé, c'était évidemment confus dans la question avec le recul. – some1

1

qui suit (code non testé) devrait être équivalent à vos boucles:

valid = set(s for s in substrings for ln in dictionary_words if s in ln) 

En Python 3.0, vous pouvez utiliser une compréhension de jeu:

valid = {s for s in substrings for ln in dictionary_words if s in ln} 

Un peu plus efficace:

valid = set(s for s in substrings if any(s in ln for ln in dictionary_words)) 
+0

Très cool. Cette dernière ligne fonctionnerait-elle en 2.7x? – some1

+0

Edit: La dernière ligne a bien fonctionné, merci FJ. – some1

+1

Pas de problème, la dernière ligne ressemble plus à ce que vous cherchez, et équivaut à ajouter l'instruction 'break'. –

0
[valid.add(my_string) for my_string in substrings for line in dictionary_words if my_string in line] 
f.writelines(sorted(valid)) 

Utilisation de List Comprehensions serait plus rapide en utilisant des boucles de la façon dont vous avez mis en œuvre.

+0

Merci beaucoup. Malheureusement, les boucles étaient meilleures que ma dernière version, qui était vraiment moche. Je vais lire sur les compréhensions de la liste. – some1

+0

Vous pouvez également écrire des compositions de listes comme vos boucles traditionnelles pour une meilleure lisibilité, (bien que je préfère le style comp de liste par défaut) ... –