2010-10-10 3 views
5

J'ai une liste:Comment vérifier si les éléments n'apparaissent dans la liste qu'une seule fois en python?

a = [1, 2, 6, 4, 3, 5, 7] 

S'il vous plaît, expliquez-moi comment vérifier si l'élément apparaît une seule fois dans la liste?

Veuillez également indiquer si tous les éléments de 1 à len(a) figurent dans la liste. Par exemple, dans la liste 'un' élément de 1 à 7 sont dans la liste, mais si la liste est b = [1, 4, 3, 5], alors tous les éléments de 1 à 4 ne sont pas dans la liste.

Merci!

+1

Que voulez-vous dire par * puis tous les éléments de 1 à 4 ne sont pas dans la liste*? D'où viennent les * 1 à 4 *? –

+0

Pour votre première question, voulez-vous vérifier si * chaque * élément n'apparaît qu'une seule fois, ou si un élément * spécifique * n'apparaît qu'une seule fois dans la liste? –

Répondre

4
len(set(a)) == len(a) 

pour la première question, et

(len(set(a)) == len(a) == max(a)) and min(a) == 1 

pour le second.

+0

La deuxième réponse requiert que tous les éléments de 'a' soient des entiers. – jfs

+1

Je voudrais beaucoup plus si c'était écrit dans le style pep8. À l'heure actuelle, le code semble horrible. –

+0

@ J.F.Sebastian: Oui, mais j'ai simplement supposé cela à partir de la question :) - @Blue Peppers: Désolé, mais j'utilise trop de langages différents pour avoir un style de codage différent pour chacun d'eux; et c'est comme ça que je l'aime le plus. – poke

5

Pour votre première question si vos éléments sont indexables, vous pouvez créer un ensemble contenant les éléments et vérifier sa longueur:

len(set(a)) == len(a) 

vous pouvez également utiliser cette fonction qui peut donner de meilleures performances que ci-dessus si le résultat est faux (mais de moins bonnes performances lorsque le résultat est vrai):

def are_all_elements_unique(l): 
    seen = set() 
    for x in l: 
     if x in seen: 
      return False 
     seen.add(x) 
    return True 
5

quand je lis votre question, je pris un sens différent de celui-ci que marque a fait. Si vous voulez vérifier si un élément particulier apparaît une seule fois, puis

def occurs_once(a, item): 
    return a.count(item) == 1 

sera vrai que si item se produit dans la liste une fois exactement.

Voir Pokes réponse à la deuxième question

+0

Ne supposez-vous pas que la liste ne contient pas de doubles? Aussi, ne devriez-vous pas seulement vérifier si chaque élément de 'range (1, n + 1)' est dans 'a'? –

+0

'range' est un générateur dans les nouveaux Pythons. – poke

+0

Oh je vois, je pense que nous avons compris la question différemment. Je pensais que tous les nombres de '1 - n' devraient être contenus dans la liste, indépendamment de l'ordre et de la position, et pourraient être mélangés avec d'autres nombres aussi. –

1

je compris que vous voulez quelque chose comme ça:

[x for x in a if a.count(x) == 1] 
3

Pour la deuxième question, vous voudrez peut-être vérifier

sorted(a) == range(1, len(a) + 1) 
Questions connexes