2014-06-23 3 views

Répondre

3
a = [1,2,3,4] 
b = [1,2] 

print any(x in a for x in b) 
True 
+0

Cela semble le moyen le plus élégant et le plus rapide – timebandit

4

Votre deuxième exemple basé sur set ne fonctionne pas parce qu'il sera toujours revenir True pour non vide a/b. Cependant ensembles sont probablement le droit d'utiliser:

if set(b).issubset(set(a)): 
    print "found" 

S'il vous plaît noter que b = set([]) est toujours un sous-ensemble de set(a).

Mise à jour: Je viens de remarquer que vous voulez seulement savoir si l'un des éléments dans b fait partie de a qui est différent de la solution que je propose. Dans ce cas, je pense qu'un simple if/elif/else est la meilleure solution. Vous pouvez essayer d'utiliser un dict ou un autre itérable avec fast-lookup.

+0

Je ne suis pas ce que vous entendez - bool (set ([5, 6]) & set ([1,2,3,4])) Ceci n'est certainement pas vrai. Ou est-ce que j'ai mal compris quelque chose? – jaime

+0

Ne comprenez pas entièrement votre première phrase.Le «&» ne serait-il pas évalué en premier et ensuite offert au «si» pour l'évaluation? – timebandit

0

Vous pouvez

if set(a) <= set(b): 
    print found 

Mais je ne peux pas dire si elle est plus efficace que votre code.

1

Peut-être que cela est trop simple, mais if...elif me semble bien à:

found = False 

if 1 in a: 
    found = True 
elif 2 in a: 
    found = True 

Cela ne vérifie si 2 est dans la liste si 1 n'est pas, puisque vous ne cherche à voir si l'une est dans la liste (ne se souciant pas laquelle), cela devrait être bon

Plus:

  • Son sim PLE
  • Vous pouvez enregistrer un contrôle sur 2 si 1 est déjà dans la liste
  • Pas besoin de convertir a à un autre type (qui l'efficacité des aides)

Contre:

  • Cela ne vous obtiendra pas de points pour flair

Timing Comparaison:

basecase = """ 
a = [1,2,3,4] 
if 1 in a or 2 in a: 
    print 'found' 
""" 

case1 = """ 
a = [1,2,3,4] 
b = [1,2] 
if set(b).issubset(set(a)): 
    print 'found' 
""" 

case2 = """ 
found = False 
if 1 in a: 
    found = True 
elif 2 in a: 
    found = True 
""" 

case3 = """ 
a = [1,2,3,4] 
b = [1,2] 
print any(x in a for x in b) 
""" 

En utilisant print min(timeit.Timer(<case>).repeat(8, 1000)) rendements

basecase = 0.0953138421204 
case1 = 0.0974782045301 
case2 = 0.0958207179797 
case3 = 0.068283250742 
+0

Cette solution me semble assez horrible. Pourquoi irions-nous avec une variable temporaire et étaler la clause 'or' dans une clause elif? – ch3ka

+0

@ ch3ka, une raison particulière pourquoi? – wnnmaw

+0

'si 1 dans a ou b dans a' est plus court et plus précis que' si 1 dans un ... elif b dans a' - et que le premier court-circuite déjà, vos pro ne tiennent pas. – ch3ka

Questions connexes