2010-12-07 8 views
0

Bonjour, J'ai écrit une petite fonction qui prend deux listes et les compare pour dupliquer des paires, et retourne une valeur booléenne. Par exemple ([1,2,3], [2,1,4]) renvoie false et ([1,2,3], [3,4,5]) renvoie vrai Mais je voudrais l'argument de prendre une quantité donnée de listes, au lieu de seulement deux.liste de vérification en python

Voici mon programme jusqu'à présent:

def check(xrr, yrr): 
    x = xrr[:] 
    x.sort() 
    y = yrr[:] 
    y.sort() 
    for i in range(len(x)-1): 
     if x[i]==y[i]: 
      return False 
    return True 

Mais aussi isnt exactement encore correctement travailler, comme ([1,2,3], [1,4,5]) renvoie également faux.

Les conseils et des idées est très apprécié

+1

Que voulez-vous dire par "Duplication paires"? Voulez-vous renvoyer True s'il y a un nombre qui peut être trouvé dans les deux listes? Ou doit-il être dans la même position dans les deux listes? Ou juste quoi? –

+1

Pourquoi voudriez-vous que '([1,2,3], [1,4,5])' renvoie 'Faux'? Le premier élément dans les deux après le tri est '1', donc' x [0] == y [0] ', et il * devrait * retourner false. La question est, * qu'est-ce que vous entendez par * ** doublons paires **? –

+0

@ A A, ouais vous avez raison, je l'ai remarqué aussi, c'est sur le point de changer! – user457142

Répondre

1

En tant que mise en œuvre naïve, vous pouvez définir une liste de listes et de hachage de la représentation interne. Par exemple:

def check(given): 
    hash = {} 
    for li in given: 
     for val in li: 
     if val in hash: 
      return False 
     hash[val] = 1 
    return True 

Cela fonctionne si vos ensembles de données d'entrée contiennent un petit nombre d'éléments uniques par rapport à la mémoire. Si vous prévoyez recevoir des ensembles de données extrêmement volumineux, vous devrez peut-être envisager une approche plus élaborée.

On notera également que cela retournera False pour les éléments répétés dans le même ensemble de données, et pour répéter des valeurs à n'importe quel emplacement dans l'ensemble de données. C'est trivial à refactoriser, ou réécrire entièrement comme les autres solutions listées ici.

+0

Merci beaucoup, c'est plus ou moins exactement ce que je cherchais :) – user457142

+3

'has_key' est totalement obsolète et obsolète. Utilisez le mot clé 'in'. au lieu. Ceci a l'avantage d'être beaucoup plus rapide dans Python 2 et disponible dans Python 3. – aaronasterling

+0

@aononasterling +1 pour le rappel. L'utilisation obsolète de 'has_key' est une habitude sale reportée de 2.3. Je signale également que http://stackoverflow.com/questions/4374426/list-checking-in-python/4374531#4374531 est la solution la plus robuste et la plus correcte. – MrGomez

3
import itertools 

def check(*args): 
    r = None 
    for l in args: 
    s = set(frozenset(x) for x in itertools.combinations(l, 2)) 
    if r is None: 
     r = s 
    else: 
     r &= s 
    if not r: 
     return True 
    return False 

print check([1, 2, 3], [3, 4, 5]) 
print check([1, 2, 3], [2, 1, 4]) 
+0

+1. Plus robuste, avec une application intéressante de 'itertools'. – MrGomez

3
def dupLists(List0,*Lists): 
    result=set(List0) 
    for l in Lists: 
     result=result.intersection(l) 
     if len(result)<2: 
      return True 
    return False 
+0

+1 pour la bonne approche, mais vous semblez avoir les valeurs de retour dans le mauvais sens. –

+0

les valeurs de retour me semblent raison? Cependant cela ne fonctionne que sur deux listes, au lieu de n'importe quelle quantité de listes – user457142

+0

@ user457142: Cela fonctionne sur n'importe quelle quantité de listes (au moins deux). C'est pourquoi je l'ai écrit pour. – Kabie