Comment l'opérateur.itemgetter et sort () travailler en Python?

j'ai le code suivant:

# initialize
a = []

# create the table (name, age, job)
a.append(["Nick", 30, "Doctor"])
a.append(["John",  8, "Student"])
a.append(["Paul", 22, "Car Dealer"])
a.append(["Mark", 66, "Retired"])    

# sort the table by age
import operator
a.sort(key=operator.itemgetter(1))    

# print the table
print(a)

il crée une table 4x3 et ensuite il la trie par âge. Ma question Est, ce qui exactement key=operator.itemgetter(1)? L' operator.itemgetter fonction retourner la valeur de l'article? Pourquoi je ne peux pas juste taper quelque chose comme key=a[x][1] il n'? Ou puis-je? Comment pourrait-avec l'opérateur d'impression d'une certaine valeur de la forme 3x2 qui est <!--5?

  1. comment Python trie-t-il exactement la table? Puis-je annuler tri il?

  2. Comment puis-je le trier en fonction de deux colonnes comme premier âge, et ensuite si l'âge est le même b nom?

  3. Comment pourrais-je le faire sans <!--6?

32
demandé sur nbro 2013-09-03 19:08:55

5 réponses

on dirait que vous êtes un peu confus à propos de tous ces trucs.

operator est un module intégré fournissant un ensemble d'opérateurs pratiques. En deux mots operator.itemgetter(n) construit un callable qui suppose un objet itérable (e.g. list, tuple, set) comme input, et en retire l'élément n-th.

Donc, vous ne pouvez pas utiliser key=a[x][1] là, parce que python n'a aucune idée de ce que x est. Au lieu de cela, vous pourriez utiliser un lambda fonction (elem est juste un nom de variable, pas de magie là):

a.sort(key=lambda elem: elem[1])

Ou tout simplement une fonction ordinaire:

def get_second_elem(iterable):
    return iterable[1]

a.sort(key=get_second_elem)

donc, voici une note importante: en python les fonctions sont des citoyens de première classe, donc vous pouvez les passer à d'autres fonctions comme paramètre.

autres questions:

  1. Oui, vous pouvez inverser le tri, il suffit d'ajouter reverse=True:a.sort(key=..., reverse=True)
  2. trier par plus d'une colonne, vous pouvez utiliser itemgetter avec de multiples indices: operator.itemgetter(1,2), ou avec lambda: lambda elem: (elem[1], elem[2]). De cette façon, les itérables sont construits à la volée pour chaque élément de la liste, qui sont ensuite comparés les uns aux autres en termes lexicographiques(?) ordre (premiers éléments comparés, si égaux-deuxièmes éléments comparés, etc)
  3. vous pouvez obtenir une valeur à [3,2] en utilisant a[2,1] (les indices sont basés sur zéro). L'aide de l'opérateur... C'est possible, mais pas aussi propre que juste l'indexation.

voir la documentation pour plus de détails:

  1. operator.itemgetter expliqué
  2. tri de la liste par clé personnalisée en Python
62
répondu J0HN 2017-05-21 15:31:17

Réponse pour Python débutants

en des mots plus simples:

  1. key= paramètre sort nécessite une clé function (à appliquer pour être des objets à trier) plutôt qu'une seule touche valeur et
  2. c'est exactement ce que operator.itemgetter(1) vous donnera: function qui saisit le premier élément d'un objet de type liste.

(Plus précisément ceux qui sont callables, pas fonctions, mais c'est une différence qui peut souvent être ignoré.)

17
répondu Lutz Prechelt 2015-04-14 14:03:19

vous posez beaucoup de questions auxquelles vous pourriez répondre par lecture de la documentation, alors je vais vous donner un conseil général: lisez-le et expérimentez dans la coquille python. Vous verrez que itemgetter renvoie un callable:

>>> func = operator.itemgetter(1)
>>> func(a)
['Paul', 22, 'Car Dealer']
>>> func(a[0])
8

le faire d'une manière différente, vous pouvez utiliser lambda:

a.sort(key=lambda x: x[1])

Et l'inverser:

a.sort(key=operator.itemgetter(1), reverse=True)

Trier par plus d'une colonne:

a.sort(key=operator.itemgetter(1,2))

voir le trier comment.

9
répondu Paulo Almeida 2013-09-03 15:31:27
a = []
a.append(["Nick", 30, "Doctor"])
a.append(["John",  8, "Student"])
a.append(["Paul",  8,"Car Dealer"])
a.append(["Mark", 66, "Retired"])
print a

[['Nick', 30, 'Doctor'], ['John', 8, 'Student'], ['Paul', 8, 'Car Dealer'], ['Mark', 66, 'Retired']]

def _cmp(a,b):     

    if a[1]<b[1]:
        return -1
    elif a[1]>b[1]:
        return 1
    else:
        return 0

sorted(a,cmp=_cmp)

[['John', 8, 'Student'], ['Paul', 8, 'Car Dealer'], ['Nick', 30, 'Doctor'], ['Mark', 66, 'Retired']]

def _key(list_ele):

    return list_ele[1]

sorted(a,key=_key)

[['John', 8, 'Student'], ['Paul', 8, 'Car Dealer'], ['Nick', 30, 'Doctor'], ['Mark', 66, 'Retired']]
>>> 
0
répondu shubham sinha 2017-03-27 22:10:42
#sorting first by age then profession,you can change it in function "fun".
a = []

def fun(v):
    return (v[1],v[2])

# create the table (name, age, job)
a.append(["Nick", 30, "Doctor"])
a.append(["John",  8, "Student"])
a.append(["Paul",  8,"Car Dealer"])
a.append(["Mark", 66, "Retired"])

a.sort(key=fun)


print a
-1
répondu user2329366 2016-06-16 07:50:40