éléments - tuple python




Vérifier si une liste a des listes en double (4)

Je ne sais pas si vous voulez une bibliothèque externe mais j'en ai une qui contient une fonction explicitement faite à cet effet: iteration_utilities.duplicates

>>> from iteration_utilities import duplicates

>>> my_list = [[1, 2, 4, 6, 10], [12, 33, 81, 95, 110], [1, 2, 4, 6, 10]]

>>> list(duplicates(my_list, key=tuple))
[[1, 2, 4, 6, 10]]

Notez que cela fonctionne aussi sans key=tuple mais avec un comportement O(n*n) au lieu de O(n) .

>>> list(duplicates(my_list))
[[1, 2, 4, 6, 10]]

Il conserve également l'ordre d'apparition (avec ou sans key ) si cela est important:

>>> list(duplicates([[1], [2], [3], [1], [2], [3]]))
[[1], [2], [3]]

Si vous n'êtes intéressé que s'il y a des doublons, vous pouvez en utiliser any au lieu de list :

>>> any(duplicates([[1], [2], [3], [1], [2], [3]]))
True
>>> any(duplicates([[1], [2], [3]]))
False

Étant donné une liste de listes, je veux m'assurer qu'il n'y a pas deux listes qui ont les mêmes valeurs et l'ordre. Par exemple avec my_list = [[1, 2, 4, 6, 10], [12, 33, 81, 95, 110], [1, 2, 4, 6, 10]] il est censé me rendre l'existence de listes en double, c'est-à-dire [1, 2, 4, 6, 10] .

Je l'ai utilisé mais ça ne marche pas comme je le veux. Est-ce que quelqu'un sait comment réparer le code:

routes = [[1, 2, 4, 6, 10], [1, 3, 8, 9, 10], [1, 2, 4, 6, 10]]
r = len(routes) - 1
i = 0
while r != 0:
    if cmp(routes[i], routes[i + 1]) == 0:
        print "Yes, they are duplicate lists!"
    r -= 1
    i += 1

vous pouvez compter les occurrences dans une liste de compréhension, en les convertissant en tuple afin de pouvoir hacher et appliquer l'unicité:

routes = [[1, 2, 4, 6, 10], [1, 3, 8, 9, 10], [1, 2, 4, 6, 10]]
dups = set(tuple(x) for x in routes if routes.count(x)>1)

print(dups)

résultat:

{(1, 2, 4, 6, 10)}

Assez simple, mais beaucoup de boucles sous le capot en raison d'appels répétés à count . Il y a une autre façon, qui implique le hachage mais qui est moins complexe: utiliser des collections.Counter .

from collections import Counter

routes = [[1, 2, 4, 6, 10], [1, 3, 8, 9, 10], [1, 2, 4, 6, 10]]

c = Counter(map(tuple,routes))
dups = [k for k,v in c.items() if v>1]

print(dups)

Résultat:

[(1, 2, 4, 6, 10)]

(Il suffit de compter les sous-listes converties en tuple - corriger le problème de hachage - et générer une liste de dup en utilisant la compréhension de la liste, en ne conservant que les éléments qui apparaissent plus d'une fois)

Maintenant, si vous voulez juste détecter qu'il y a des listes en double (sans les imprimer), vous pouvez

  • convertir la liste des listes en une liste de tuples afin que vous puissiez les hacher dans un ensemble
  • comparer la longueur de la liste à la longueur de l'ensemble:

len est différent s'il y a des doublons:

routes_tuple = [tuple(x) for x in routes]    
print(len(routes_tuple)!=len(set(routes_tuple)))

ou, être capable d'utiliser map dans Python 3 est assez rare pour être mentionné ainsi:

print(len(set(map(tuple,routes))) != len(routes))

for x in routes:

    print x, routes.count(x)

cela vous renverra chaque liste et combien de fois cela apparaîtra. alternativement, vous ne pouvez montrer que s'ils apparaissent> 1:

new_list = []

for x in routes:

    if routes.count(x)>1:

        if x not in new_list:

            new_list.append(x)

for x in new_list:

    print x, routes.count(x)

J'espère que cela aide!


routes = [[1, 2, 4, 6, 10], [1, 3, 8, 9, 10], [1, 2, 4, 6, 10]]
dups = set()

for route in routes:
    if tuple(route) in dups:
        print('%s is a duplicate route' % route)
    else:
        dups.add(tuple(route))




duplicates