Hoe werken operator.itemgetter() en sort()?

Ik heb de volgende code:

# 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)

Het maakt een 4×3-tabel en sorteert deze vervolgens op leeftijd. Mijn vraag is, wat doet key=operator.itemgetter(1)precies? Retourneert de functie operator.itemgetterde waarde van het item? Waarom kan ik daar niet gewoon iets als key=a[x][1]typen? Of kan ik? Hoe kan met de operator een bepaalde waarde van het formulier worden afgedrukt, zoals 3x2, wat 22is?

  1. Hoe sorteert Python de tabel precies? Kan ik het omgekeerd sorteren?

  2. Hoe kan ik het sorteren op basis van twee kolommen, zoals eerste leeftijd, en vervolgens of leeftijd dezelfde b-naam is?

  3. Hoe zou ik het kunnen doen zonder operator?


Antwoord 1, autoriteit 100%

Het lijkt erop dat je een beetje in de war bent over al die dingen.

operatoris een ingebouwde module die een reeks handige operators biedt. In twee woorden construeert operator.itemgetter(n)een callable die een itereerbaar object (bijv. list, tuple, set) als invoer aanneemt, en haalt het n-de element eruit.

Dus je kunt key=a[x][1]daar niet gebruiken, omdat python geen idee heeft wat xis. In plaats daarvan zou je een lambda-functie kunnen gebruiken (elemis slechts een variabelenaam, geen magie daar):

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

of gewoon een gewone functie:

def get_second_elem(iterable):
    return iterable[1]
a.sort(key=get_second_elem)

Dus, hier is een belangrijke opmerking: in Python-functies zijn eersteklas burgers , U kunt ze dus doorgeven aan andere functies als een parameter.

Andere vragen:

  1. Ja, u kunt omkeren, sorteren, gewoon toevoegen reverse=True: a.sort(key=..., reverse=True)
  2. Om te sorteren op meer dan één kolom die u kunt gebruiken itemgettermet meerdere indices: operator.itemgetter(1,2), of met lambda: lambda elem: (elem[1], elem[2]). Op deze manier zijn de iterables op de vlucht geconstrueerd voor elk item in de lijst, die dan vergeleken met elkaar in lexicographic (?) Bestelling (eerste elementen vergeleken, indien gelijk – tweede elementen vergeleken, enz.)
  3. U kunt waarde ophalen bij [3,2] met a[2,1](indices zijn op nul gebaseerd). Gebruik van de operator … het is mogelijk, maar niet zo schoon als alleen indexering.

Raadpleeg de documentatie voor meer informatie:

  1. operator.itemgetteruitgelegd
  2. sorteerlijst per aangepaste sleutel in Python

Antwoord 2, Autoriteit 31%

Antwoord voor Python-beginners

In eenvoudiger woorden:

  1. De key=Parameter van sortvereist een sleutel -functie (om te worden toegepast om objecten te worden gesorteerd) in plaats van een enkele sleutel Waarde en
  2. dat is precies wat operator.itemgetter(1)je zal geven: Een functiedie het eerste item van een lijstachtig object pakt.

(Precies dat zijn callables, geen functies, maar dat is een verschil dat vaak kan worden genegeerd.)


Antwoord 3, autoriteit 13%

U stelt veel vragen die u zelf zou kunnen beantwoorden door de documentatie te lezen, dus ik zal je een algemeen advies geven: lees het en experimenteer in de python-shell. Je zult zien dat itemgettereen callable retourneert:

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

Om het op een andere manier te doen, kun je lambdagebruiken:

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

En draai het om:

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

Sorteren op meer dan één kolom:

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

Zie de sorteerprocedure.


Antwoord 4

#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

Antwoord 5

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']]
>>> 

Other episodes