Как делает оператор.itemgetter и sort() работают в Python?

у меня есть следующий код:

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

он создает таблицу 4x3, а затем сортирует ее по возрасту. Мой вопрос в том, что именно key=operator.itemgetter(1) делает? Делает operator.itemgetter функция возвращает значение элемента? Почему я не могу просто напечатать что-то вроде key=a[x][1] есть? Или могу? Как с помощью оператора можно напечатать определенное значение формы, например 3x2 что это 22?

  1. как именно Python сортирует таблицу? Я могу обратного рода это?

  2. как я могу сортировать его на основе двух столбцов, таких как first age, а затем, если age-то же имя b?

  3. как я мог это сделать без operator?

5 ответов


Похоже, вы немного смущены всем этим.

operator встроенный модуль обеспечивая набор удобных операторов. В двух словах!--3--> создает вызываемый объект, который принимает итерационный объект (например, list, tuple, set) в качестве входных данных и извлекает из него n-й элемент.

таким образом, вы не можете использовать key=a[x][1] там, потому что python понятия не имеет, что x есть. Вместо этого вы можете использовать


ответ для начинающих Python

проще говоря:

  1. The на sort требует ключ функции (применяется для сортировки объектов), а не один ключ стоимостью и
  2. именно так operator.itemgetter(1) даст вам: A функции это захватывает первый элемент из объекта, подобного списку.

(точнее те callables, не функции, но это разница, которую часто можно игнорировать.)


вы задаете много вопросов, на которые вы смогли ответить сами чтение документации, поэтому я дам вам общий совет: прочитайте его и поэкспериментируйте в оболочке python. Вы увидите это itemgetter возвращает вызываемый:

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

чтобы сделать это по-другому, вы можете использовать lambda:

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

и наоборот:

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

сортировка по нескольким столбцам:

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

посмотреть сортировка как К.


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

#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