2015-10-09 1 views
1

Voici à quoi cela ressemblait pour moi: Je ne comprends pas pourquoi il ne s'imprime pas fauxJ'essaie le code suivant ... si au moins un membre de la liste ne correspond pas ..... imprimer Faux

a = [1,2,3,4,5] 
b= [11,6,7,8,9] 

def overlapping(a,b): 
    bool= True 
    for x in range(len(a)): 
    for y in range(len(b)): 
      if b[y]==a[x]: 
      check("True") 
      break 

def check(str): 
     if str =="True": 
      print "True" 
     else: 
      print "False" 

overlapping(a,b) 
+3

Parce que vous appelez uniquement 'check' dans le cas'on'? Et pourquoi passez-vous une * chaîne * ?! – jonrsharpe

+0

Découvrez [Test de la valeur de la vérité] (https://docs.python.org/2/library/stdtypes.html#truth-value-testing) en Python. Il peut être un piège commun lorsque vous commencez. –

Répondre

0

il n'y a pas besoin de boucler deux fois: Faites comme cela, utilisez set

a = [1,2,3,4,5] 
b = [11,6,7,8,9] 
if set(a) & set(b): 
    print "true" 
else: 
    print "False" 

rendre plus pythonique:

a = [1,2,3,4,5] 
b = [11,6,7,8,9] 
def overlapping(a, b): 
    return bool(set(a) & set(b)) 
overlapping(a, b) 
+0

'len (set (a) & set (b))> 0' est definitly _less_ pythonique qu'un simple' set (a) & set (b) ' –

+0

@brunodesthuilliers pouvez-vous m'expliquer ?? – Hackaholic

+0

tous les objets Python ont une valeur de vérité dans un contexte booléen. Dans le cas de séquences intégrées ou de types de conteneurs (dicts, ensembles, listes, tuples, chaînes, etc.), un objet vide a une valeur False. Donc l'idiome pythonique est 'if container:', pas 'if len (container)> 0'. Si vous voulez vraiment renvoyer une valeur strictement booléenne il devrait être 'return bool (set (a) & set (b))' –

0

En utilisant method any et expression du générateur

code:

list1 = [1,2,3,4,5] 
list2= [11,6,7,8,9] 

def overlapping(list1,list2): 

    return any(value in list2 for value in list1) 

print overlapping(list1,list2) 

Apporter des modifications à votre code:

a = [1,2,3,4,5] 
b= [11,6,7,8,9] 

def overlapping(a,b): 
    for x in a: 
     if x in b: 
      check("True") 
      break 
    else: 
     check("False") 


def check(strs): 
    print strs 

overlapping(a,b) 

Notes:

Il n'y a pas besoin d'appeler fonction vérifier le péché CE imprime la même valeur vous pouvez simplement l'imprimer

+1

'any' retour vrai ou faux, vous n'avez pas besoin de donner if condition, seulement 'return any (valeur dans list2 pour value dans list1)' devrait fonctionner – Hackaholic

+1

la compréhension de la liste est inutile ici, vous obtenez le même résultat sans la surcharge de la construction de liste avec une expression génératrice 'any (value in list2 pour value in list1) ' –

+0

vous avez tous deux raison changé – The6thSense

0
In [3]: a = [1,2,3,4,5] 
    ...: b= [11,6,7,8,9] 
    ...: 
    ...: def overlapping(a,b): 
    ...:  my_break = False 
    ...:  for x in range(len(a)): 
    ...:   if my_break: break 
    ...:   for y in range(len(b)): 
    ...:    if my_break: break 
    ...:    if b[y]==a[x]: 
    ...:     check("True") 
    ...:    else: 
    ...:     check("False") 
    ...:     my_break = True 
    ...: 
    ...: def check(string): 
    ...:  if string == "True": 
    ...:  print "True" 
    ...:  else: 
    ...:  print "False" 
    ...: 
    ...: overlapping(a,b) 
    ...: 
False 

ou

In [4]: def overlapping(a, b): 
    ...:  return any(x in b for x in a) 
    ...: 

In [5]: overlapping(a, b) 
Out[5]: False 

Aussi ne pas utiliser mot str, son type intégré.

0

Essayez cette utilisation return au lieu de break

a = [1,2,3,4,5] 
b= [33,6,7,8,9] 

def overlapping(a,b): 
    bool= True 
    for x in range(len(a)): 
     for y in range(len(b)): 
      if b[y]==a[x]: 
       return(check("True")) 

    return(check("False")) 

def check(str): 
     if str =="True": 
      print "True" 
     else: 
      print "False" 

overlapping(a,b)