2016-02-12 2 views
2

Я новичок в Python, и в настоящее время я решаю вопросы, чтобы улучшить свои навыки кодирования. Я наткнулся на вопрос, где я должен найти максимальное значение в List, и это соответствующее значение в другом List с таким же index номером максимального значения.Работа с перечислением в Python

, например: У меня есть два Lists со значениями L1 = [9, 12, 9 ,6] и L2 = [2, 3, 4, 5] Я должен найти максимальное значение в List L1 и индекс максимального значения следует использовать в List L2 найти это соответствующее значение.

Max value in List L1 - 12 
Index of the max value - 1 
print L2[1] -> 3 

Чтобы достичь вышеуказанной логики, я перепробовал путь и получил его. Но я не могу понять, как работает эта логика.

import operator 
index, value = max(enumerate(l1), key=operator.itemgetter(1)) 
print value, 
print l2[index] 

ВЫВОД: 12 3

Чтобы понять, как данная функция работает, я пытался напечатать каждый раздел по отдельности, но все еще не в состоянии понять, как логика работает.

print l1 - [9, 12, 9 , 6] 
print l2 - [2, 3, 4, 5] 
print list(enumerate(l1)) - [<0, 9>, <1, 12>, <2, 9>, <3, 6>] 
print list(enumerate(l2)) - [<0, 2>, <1, 3>, <2, 4>, <3, 5>] 
print max(enumerate(l1)) - <3, 6> 
print max(enumerate(l2)) - <3, 5> 

Пожалуйста, помогите мне понять, как enumerate функция и key=operator.itemgetter(1))[0] работает в вышеуказанной логике. Заранее спасибо. Ваша помощь очень ценится.

+2

Вы Google штук? ['enumerate'] (https://www.google.com/search?q=python+enumerate), [' operator.itemgetter'] (https://www.google.com/search?q=python+itemgetter) и ['key'] (https://www.google.com/search?q=python+max+key)? Что конкретно вы не понимаете? – user2357112

ответ

1

enumerate создает функцию генератора, который фактически превращает список значений в список кортежей.

L1 = [9, 12, 9, 6] 

становится

[(0, 9), (1, 12), (2, 9), (3, 6)] 

max функция находит максимальное значение в этом списке. Если никакие другие аргументы не были предоставлены max, он будет сравнивать tuples друг с другом, и этот элемент будет максимальным - (3, 6). Но мы этого не хотим. Мы не хотим, чтобы он использовал число enumerate в сравнении.

принимает аргумент key, который должен быть функцией, которая принимает один аргумент, который будет значением из списка, и должен возвращать значение, которое будет использоваться для сортировки списка и выбора максимального значения. В этом случае мы хотим отсортировать список на основе второго числа в каждом наборе (т. Е. 6 в (3, 6)).

operator.itemgetter - это функция, которая возвращает функцию, которая возвращает индексированный элемент объекта, на который он вызван. Например:

L1 = [3, 4, 6, 2] 
f = operator.itemgetter(0) 
f(L1) 
# 3 

f = operator.itemgetter(2) 
f(L1) 
# 6 

В этом случае, он использует operator.itemgetter(1), который собирается вернуть 6 в (3, 6)

Так что результат мы получаем от max(enumerate(l1), key=operator.itemgetter(1)) является tuple с индексом максимального значения а максимальное значение в L1.

+0

Спасибо за объяснение, я не мог понять, как работает 'operator.itemgetter (1)' и какое значение должно быть указано в скобках, как 1 в этом случае ? – Dev

1

enumerate() просто создает кортежи с исходным значением плюс индекс, в порядке (index, item), для каждого элемента во входном истребителе. См. What does enumerate mean?

max() выбирает максимальное значение из последовательности, заданной ключом. По умолчанию используется значение самого значения, но с operator.itemgetter(1) вы сообщаете max(), чтобы обратить внимание только на второе значение каждого элемента ввода.

Вы можете легко играть с этим, чтобы увидеть, что max() всегда возвращает исходное значение из списка, но изменяет значение, которое возвращается при использовании функции key. Вы можете использовать любую функцию, в том числе один, созданный с lambda:

>>> L1 = [9, 12, 9, 6] 
>>> max(L1) # straight up, biggest value in the list 
12 
>>> max(L1, key=lambda v: len(str(v))) # value with the most digits, 12 has two digits 
12 
>>> max(L1, key=lambda v: abs(v - 10)) # value furthest from 10; 6 is the furthest 
6 

При вызове operator.itemgetter() по крайней мере один аргумент, он будет производить объект, который при вызове с последовательностью, будет использовать аргумент (s) как индексы для этой последовательности. operator.itemgetter(1) создает объект, который всегда выбирает второй элемент (Python начинает отсчет 0), operator.itemgetter(2) бы вернуть 3-й элемент каждый раз, когда вы называете его:

>>> from operator import itemgetter 
>>> ig2 = itemgetter(2) 
>>> ig2 
operator.itemgetter(2) 
>>> ig2(L1) # the 3rd element in L1 is 9 
9 

Учитывая, что enumerate() помещает исходное значение во втором положении из каждого кортежа он производит, max(), выбирая максимальное значение из последовательности кортежей на основе значения из исходного списка ввода. Тем не менее, он сохранит кортежи, произведенные enumerate().

Если вы опустили key, вы получите самый большой «набор»; кортежи сравниваются по первому содержащемуся элементу, который отличается.Таким образом, (1, 2) больше, чем (1, 0), потому что второй элемент, 2 больше, чем 0. Но (2, 1) больше, чем (1, 1), потому что первый элемент отличается и 2 является более крупным. Поскольку enumerate() добавляет увеличение индексов (начиная с 0), что означает max() без key всегда будет выбрать элемент последний:

>>> max(enumerate(l1)) # last element is (3, 6) 
(3, 6) 

Этот элемент был выбран потому, что 3 является самым высоким показателем.

Обратите внимание, что использование enumerate() здесь излишне. Вы можете просто использовать zip() function в паре L1 и L2 вместо:

l1max, corresponding_l2 = max(zip(L1, L2)) 

zip() пар до элементов L1 и L2, производя кортежи с (9, 2), (12, 3) и т.д. max() выбирает самый большой кортеж из этой последовательности, глядя сначала в первом элементе (взято из L1).

+0

Блестяще, спасибо. Я также изучу ok 'zip'. спасибо за подробное объяснение. – Dev

-3

@Dev: Функция Перечислите просто выводит список и его значение индекса и ключ то, что вы хотите работать с относительно структуры данных, пожалуйста, найти код ниже

index, value = min(enumerate(l1), key=operator.itemgetter(1)) 
print value 
6 
print index 
3 
index, value = max(enumerate(l1), key=operator.itemgetter(1)) 
print index 
1 
print value 
12 
sorted(enumerate(l1), key=operator.itemgetter(1)) 
[(3, 6), (0, 9), (2, 9), (1, 12)] 
sorted(enumerate(l1), key=operator.itemgetter(0)) 
[(0, 9), (1, 12), (2, 9), (3, 6)] 
+0

Я пытаюсь объяснить перечисление и оператор ключа, с приведенным выше примером – Bangi

1

С помощью:

Помощь по встроенной функции макс в модуле встроенных команд:

макс (...) макс (Iterable, * [, по умолчанию = OBJ, ключ = Func ]) -> значение макс (arg1, arg2, * арг, * [, ключ = FUNC]) -> значение

With a single iterable argument, return its biggest item. The 
default keyword-only argument specifies an object to return if 
the provided iterable is empty. 
With two or more arguments, return the largest argument. 

И

Помощь по классу itemgetter в модуле оператора:

класс itemgetter (builtins.object) | itemgetter (item, ...) -> itemgetter object | | Возвращайте вызываемый объект, который извлекает заданный элемент (ы) из его операнда. | После f = itemgetter (2) вызов f (r) возвращает r [2]. | После того, как г = itemgetter (2, 5, 3), то вызов г (г) возвращает (г [2], г [5], г [3])

Так, itemgetter делает то, что говорит его название : он получает указанные элементы от элементов списка. В этом случае используются два элемента (с индексом 1). Это то, что вы делаете:

Вы вызываете макс на выходе порожденного Перечислим:

[<0, 9>, <1, 12>, <2, 9>, <3, 6>] 

и сказать ему, чтобы определить максимум на основе ключа определяется по формуле:

key=operator.itemgetter(1)), 

что - это второе значение каждого элемента в списке. Затем max возвращает найденный элемент, который имеет форму (индекс, значение).