2010-02-03 5 views
5

En Perl, on peut faire leQuel est l'équivalent python du modèle Perl à suivre si quelque chose a déjà été vu?

for (@foo) { 
    # do something 
    next if $seen{$_}++; 
} 

suivant, je voudrais être en mesure de faire l'équivalent en Python, qui est de sauter un bloc si elle a été exécutée une fois.

+2

Vous savez comment ignorer l'itération actuelle d'une boucle en Python, oui? Vous savez aussi comment utiliser les hachages en Python? Et comment utiliser les conditionnels? Vous pouvez simplement mettre tout cela ensemble et vous avez votre solution. –

+0

Anon, non, je ne sais pas pourquoi je demande. "next si $ seen {$ _} ++" exprime bien ce que j'essaie de faire et il semble que les équivalents python ne semblent pas aussi élégants. Bien qu'il semble que cela pourrait correspondre à la facture par Greg. – jnman

+0

Peut-être par «élégant» vous voulez dire «concis» ou «concis»? C'est correct si pour vous concis/concis signifie élégant, puisque la beauté est dans l'œil du spectateur, cependant s'il vous plaît ne pas utiliser des conditions subjectives chaque fois que vous demandez l'aide des autres; vous et seulement vous savez ce qui est élégant pour vous. – tzot

Répondre

11
seen = set() 
for x in foo: 
    if x in seen: 
     continue 
    seen.add(x) 
    # do something 

Pour plus d'informations, consultez la documentation .

En outre, les exemples en bas de la documentation du module itertools contient un générateur unique_everseen que vous pouvez utiliser comme ceci:

for x in unique_everseen(foo): 
    # do something 
+0

Merci. On dirait que unique_everseen pourrait faire l'affaire bien qu'il semble être répertorié comme une recette optionnelle au lieu de faire partie du module. – jnman

+0

jnman, ne laissez personne forcer Python sur vous. Je veux dire, de la façon dont vous choisissez d'écrire vos commentaires, il est évident que vous trouvez Python au mieux un mal nécessaire (c'est peut-être une exigence du travail) et sa bibliothèque manque sévèrement (contrairement au magnifique CPAN). – tzot

+0

Je suis beaucoup plus à l'aise avec perl qu'avec python. Cependant, à cause de certaines choses sur lesquelles je travaille actuellement, je dois plutôt utiliser python, d'où les questions. Il semble juste que ce perl (ism) particulier soit suffisamment utile (pour moi) que je suis quelque peu surpris qu'il n'y ait pas de version "laconique" équivalente en python (pour utiliser vos mots). – jnman

1
seen={} 
for item in foo: 
    if seen.has_key(item): 
     seen[item]+=1 
     continue # continue is optional, just to illustrate the "next" in Perl 
    else: 
     seen[item]=1 
+0

Alternativement 'from collections import defaultdict; vu = defaultdict (int); pour l'élément dans foo: seen [item] + = 1; si vu [item]> 1: continuer; #rest of code' (avec indentation correcte, bien sûr.) –

+0

oui, +1 pour ça. Mais je suppose que je suis toujours old school, donc cela fonctionne pour la version <2.4+ – ghostdog74

1

Si vous ne se soucient pas de l'ordre des choses foo, et seulement que les éléments uniques sont itérés plus, alors la solution est beaucoup plus simple.

for x in set(foo): 
    do something 
Questions connexes