2010-08-19 8 views
5

Si j'ai Liste PhoneDirectory Par exemple:Comparaison Substring en python

['John:009878788677' , 'Jefrey:67654654645' , 'Maria:8787677766'] 

Quelle est la fonction qui peut être utilisé pour comparer la présence de sous-chaîne (Ex: Joh) dans chaque entrée dans la liste.

J'ai essayé d'utiliser

if(PhoneDirectory.find(Joh) != -1) 

mais cela ne fonctionne pas

de bien vouloir aider ..

+0

Votre désignation est peu. Les noms de variables de majuscules sont généralement réservés par convention aux Classes. PhoneDirectory regarde la liste des chaînes pour moi, je l'appellerais phonenumbers selon les conventions de nommage Python. Je trouve utile d'avoir des noms de variables de liste pour être pluriels. –

+0

Juste pour souligner, ce ne serait pas mieux stocké comme un dictionnaire? '{s.split (": ") [0]: s.split (": ") [1] pour s dans ...}' ' – katrielalex

Répondre

15

Si vous voulez vérifier chaque entrée séparément:

for entry in PhoneDirectory: 
    if 'John' in entry: ... 

Si vous voulez juste savoir si toute entrée satisfait à la condition et ne se soucient pas lequel:

if any('John' in entry for entry in PhoneDirectory): 
    ... 

Notez que any ne fera aucun travail "gaspillé" - il renverra True dès qu'il en trouvera un entrée répondant à la condition (si aucune entrée ne remplit la condition, elle doit vérifier chacun d'entre eux pour confirmer cela, bien sûr, puis renvoie False).

+4

+1 pour 'any'. Très sympa. –

+0

Comme vous êtes proche du développement de Python, savez-vous pourquoi aucun ne retourne la première valeur "Vrai" (disons "Johnny") mais seulement moins utile True (même l'interprète doit connaître la réponse exacte). C'est-à-dire: travailler comme ou en Python ou le principe du "résultat utile" en Lisp? BTW peut-être il devrait être: le cas échéant (entry.startswith'John: 'dans l'entrée pour l'entrée dans PhoneDirectory) –

+0

@Tony, puisque 'any' doit retourner' False' (par exemple pour une liste vide, ne peut pas simplement " renvoie une fausse valeur de la séquence ") quand il dit" non ", pour des raisons de symétrie il a été jugé préférable de toujours faire revenir un booléen.Re votre BTW, peut-être, mais (si oui) alors seulement après avoir corrigé l'erreur de syntaxe dans votre suggestion (mettre des parenthèses autour de «John:» ;-). –

0

Vous pouvez faire une scission sur « : » et recherchez les occurrences de ce que vous recherchez dans le premier élément du tableau résultant.

dir = ['John:009878788677' , 'Jefrey:67654654645' , 'Maria:8787677766']; 
for a in dir: 
    values = a.split(":") 
    if values[0] == "John": 
     print("John's number is %s" % (values[1])) 
+0

Un peu trop compliqué, il n'est vraiment pas nécessaire de diviser chaque entrée. –

+0

True. C'est la seule façon que je sais faire en Python! :-) Aimé la "toute" réponse. –

+0

Merci C'était génial. –

1

Comme personne n'a recommandé pour l'instant, je le ferais:

all_johns = [p for p in PhoneDirectory if 'Joh' in p] 
0

Si le nombre de performance pour cette tâche utilisent une mise en œuvre SuffixTree. Ou faites simplement tout moteur de SGBD faire le travail d'indexation.

3
if any(entry.startswith('John:') in entry for entry in PhoneDirectory) 

Mais je préparerais quelque chose avec deux éléments que vous la liste des chaînes ne sont pas bien adapté à la tâche:

PhoneList = ['John:009878788677' , 'Jefrey:67654654645' , 'Maria:8787677766'] 

numbers = { a:b 
      for item in PhoneList 
      for a,_,b in (item.partition(':'),) 
      } 

print numbers 
print "%s's number is %s." % ('John', numbers['John'])