'key' ve lambda ifadesini kullanan python max işlevi


181

OOP geçmişinden geliyorum ve python öğrenmeye çalışıyorum. Kullanıyorum maxtipi örneği dönmek için bir lambda ifade kullanan işlevi Playerolan en totalScorelistesi arasında players.

def winner():
    w = max(players, key=lambda p: p.totalScore)

İşlev Player, maksimum değere sahip tür örneğini doğru olarak döndürür totalScore. Aşağıdaki üç şey hakkında kafam karıştı:

  1. maxİşlev nasıl çalışır? Aldığı tartışmalar nelerdir? Belgelere baktım ama anlayamadım.
  2. Anahtar kelimenin keymax işlevinde kullanımı nedir ? sortİşlev bağlamında da kullanıldığını biliyorum
  3. Lambda ifadesinin anlamı? Onları nasıl okuyabilirim? Nasıl çalışırlar?

Bunların hepsi çok noobish kavramsal sorular ama dili anlamama yardımcı olacak. Açıklamak için örnekler verebilirseniz yardımcı olacaktır. Teşekkürler


Hangi Python sürümü?
charmlessCoin

2
Belgelere danıştınız mı ?
Inbar Rose

Coin python 2.7.5
Vijay

2
@InbarRose Maks işlevi için belgeleri kontrol ettim. Gerçekten anlamadım.
Vijay

10
@InbarRose Bu sayfa artık Google için en iyi sonuçtur python max lambdave belki de yeni kullanıcılar için daha yararlı olabilir.
Mark

Yanıtlar:


278

lambda anonim bir işlevdir, şuna eşdeğerdir:

def func(p):
   return p.totalScore     

Şimdi maxolur:

max(players, key=func)

Ancak defifadeler bileşik ifadeler olduğundan, bir ifadenin gerekli olduğu yerlerde kullanılamazlar, bu yüzden bazen lambdakullanılır.

Bunun lambda, bir dönüş ifadesine eklediğinize eşdeğer olduğunu unutmayın def. Bu nedenle, a içindeki ifadeleri kullanamazsınız lambda, sadece ifadelere izin verilir.


Ne yapar max?

max (a, b, c, ... [, anahtar = işlev]) -> değer

Tek bir yinelenebilir argümanla, en büyük öğesini döndürün. İki veya daha fazla bağımsız değişkenle, en büyük bağımsız değişkeni döndürün.

Yani, en büyük nesneyi döndürür.


Nasıl keyçalışır?

Python 2'de varsayılan olarak keyöğeleri nesnelerin türüne göre bir dizi kurala göre karşılaştırır (örneğin bir dize her zaman bir tamsayıdan daha büyüktür).

Karşılaştırmadan önce nesneyi değiştirmek veya belirli bir niteliğe / dizine göre karşılaştırmak için keybağımsız değişkeni kullanmanız gerekir .

Örnek 1:

Basit bir örnek olarak, dize biçiminde bir sayı listeniz olduğunu, ancak bu öğeleri tamsayı değerleriyle karşılaştırmak istediğinizi varsayalım.

>>> lis = ['1', '100', '111', '2']

Burada maxöğeleri orijinal değerlerini kullanarak karşılaştırır (dizeler sözlükbilimsel olarak karşılaştırılır, böylece '2'çıktı olarak elde edersiniz ):

>>> max(lis)
'2'

Onların tamsayı değeri kullanılarak öğeleri karşılaştırmak keybir basit ile lambda:

>>> max(lis, key=lambda x:int(x))  # compare `int` version of each item
'111'

Örnek 2: maxBir tuples listesine uygulama .

>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]

Varsayılan maxolarak öğeleri ilk dizine göre karşılaştırır. İlk dizin aynıysa, ikinci dizini karşılaştırır. Örneğimde olduğu gibi, tüm öğelerin benzersiz bir ilk dizini vardır, bu yüzden bunu yanıt olarak alırsınız:

>>> max(lis)
(4, 'e')

Ancak, her bir öğeyi dizin 1'deki değerle karşılaştırmak isterseniz ne olur? Basit: kullanın lambda:

>>> max(lis, key = lambda x: x[1])
(-1, 'z')

Farklı türde nesneler içeren bir yinelenebilir öğedeki öğeleri karşılaştırma :

Karışık ürünler içeren liste:

lis = ['1','100','111','2', 2, 2.57]

Python 2'de iki farklı tipteki öğeleri karşılaştırmak mümkündür :

>>> max(lis)  # works in Python 2
'2'
>>> max(lis, key=lambda x: int(x))  # compare integer version of each item
'111'

Ancak Python 3'te bunu artık yapamazsınız :

>>> lis = ['1', '100', '111', '2', 2, 2.57]
>>> max(lis)
Traceback (most recent call last):
  File "<ipython-input-2-0ce0a02693e4>", line 1, in <module>
    max(lis)
TypeError: unorderable types: int() > str()

Ancak bu, her nesnenin tamsayı sürümünü karşılaştırdığımız için çalışır:

>>> max(lis, key=lambda x: int(x))  # or simply `max(lis, key=int)`
'111'

Sanırım bu eski, ama bununla ilgili bir sorum vardı. Lambda işlevi için, x veya i değişkeni veya başka bir şey her zaman listedeki bu dizindeki değeri temsil eder. Bu yineleme maksimum işlev veya lambda tarafından mı yapılır? Lambda fonksiyonları her zaman olası değerler üzerinde yineleniyor mu? Örneğin: Ben lambda listedeki her kelimenin üzerine yineleme görüyoruz. Bunu her zaman yapar mı? lengths = map(lambda word: len(word), words)words=['It', 'is', 'raining', 'cats', 'and', 'dogs']
Mo2

1
@ Mo2 Yineleme yapılır maxdeğildir lambda( keyarg isteğe bağlıdır) ve yineleme sırasında her öğe işlevinde belirtilen geçirilir keyve geri değeri daha sonra karşılaştırma için kullanılır.
Ashwini Chaudhary

2
Sadece buraya "max key parametresi" ni girerek gelen insanlar için. max(lis, key=lambda x:int(x))olarak basitleştirilebilir max(lis, key=int). Python yerleşik bir fonksiyona sahiptir, int (). Benzer şekilde, diğer yerleşik işlevleri keybağımsız değişken olarak kullanabilirsiniz. Örneğin siz en uzun dize alabilirsiniz lis=['a', 'aa', 'aaa']tarafındanmax(lis, key=len)
YOUNG

1
@YOUNG Biz fonksiyonları yerleşik sadece anahtarı argüman olarak herhangi bir işlevi kullanabilirsiniz, ancak koşul fonksiyonu tarafından kendisine iletilen öğeleri kabul gerektiğidir max, min, sortedvb düzgün. Artı max(lis, key=int)en sonunda bahsetmiştim . :-)
Ashwini Chaudhary

@Ashwini Chaudhary .. varsayalım [1,2,3,4,5] gibi bir listem varsa. burada tüm öğeler farklı. En sık kullanılan öğeleri bulmak için verilen işlev max (set (mylist), key = mylist.count) kullanıyorum. çünkü bu durumda tekrarlayan bir öğe yoktur. en düşük öğeyi döndürüyor. Böyle bir durumda sıfır veya null döndürecek bir şey yapabilir miyiz.
Vikrant Rana

12

Son derece basitleştirilmiş sürümü max:

def max(items, key=lambda x: x):
    current = item[0]
    for item in items:
        if key(item) > key(current):
            current = item
    return current

Lambda ile ilgili:

>>> ident = lambda x: x
>>> ident(3)
3
>>> ident(5)
5

>>> times_two = lambda x: 2*x
>>> times_two(2)
4

10

Max işlevi nasıl çalışır?

Yinelenebilir bir "en büyük" öğeyi arar. Bunun ne olduğunu araştırabileceğinizi varsayacağım, ancak eğer değilse, üzerinde döngü yapabileceğiniz bir şey, yani bir liste veya dize.

Max fonksiyonunda anahtar kelime anahtarının kullanımı nedir? Sıralama işlevi bağlamında da kullanıldığını biliyorum

Keymaxyinelemedeki hangi nesnelerin diğerlerinden daha büyük olduğunu söyleyen bir lambda işlevidir . Tam sayı gibi bariz bir şey değil, kendi oluşturduğunuz bir nesneyi sıralayıp sıralamadığınızı söyleyin.

Lambda ifadesinin anlamı? Onları nasıl okuyabilirim? Nasıl çalışırlar?

Bu biraz daha büyük bir soru. Basit bir ifadeyle, bir lambda, geçebileceğiniz ve diğer kod parçalarının kullanmasını sağlayan bir işlevdir . Örneğin bunu ele alalım:

def sum(a, b, f):
    return (f(a) + f(b))

Bu iki nesneyi alır ave bve bir işlev f. f()Her nesneyi çağırır , sonra bunları toplar. Bu çağrıya bakın:

>>> sum(2, 2, lambda a:  a * 2)
8

sum()alır 2ve üzerinde lambda ifadesini çağırır. Böylece f(a)olur 2 * 2, bu da 4 olur. Daha sonra bunu yapar bve ikisini birlikte ekler.

Çok basit bir ifadeyle, lambdalar, bir işlevi döndüren bir işlev fikri olan lambda hesabından gelir; hesaplamayı ifade etmek için çok iyi bir matematik konsepti. Bu konuda okuyabilir burada ve daha sonra aslında anlıyorum onu burada .

Lambdalar kafa karıştırıcı olabileceğinden, bu konuda biraz daha okumak daha iyidir ve ne kadar yararlı oldukları hemen belli değildir. Buradan kontrol edin .


7

maxişlevi bir iterable.

Yineleyiciler, listeler, tuples, dikte nesneleri, vb. Veya hatta sağladığınız örnekteki gibi özel nesneler olabilir.

max(iterable[, key=func]) -> value
max(a, b, c, ...[, key=func]) -> value

With a single iterable argument, return its largest item.
With two or more arguments, return the largest argument.

Bu nedenle, key=functemelde key, verilen yineleyici / bağımsız değişkenler sıralanan ve maksimum döndürülen işleve isteğe bağlı bir bağımsız değişken iletmemize izin verir .

lambdapseudo işlevi olarak işlev gören bir python anahtar kelimesidir. Böylece, playernesneyi ona ilettiğinizde, geri dönecektir player.totalScore. Böylece, işleve aktarılan yinelenebilir , kendisine verilen nesnelerin totalScore'amax göre key sıralanırplayer ve playerkimin maksimum değere sahip olduğunu döndürür totalScore.

Herhangi bir keyargüman sağlanmazsa, maksimum varsayılan Python siparişlerine göre döndürülür.

Örnekler -

max(1, 3, 5, 7)
>>>7
max([1, 3, 5, 7])
>>>7

people = [('Barack', 'Obama'), ('Oprah', 'Winfrey'), ('Mahatma', 'Gandhi')]
max(people, key=lambda x: x[1])
>>>('Oprah', 'Winfrey')

6

Belgelere göre :

max (yinelenebilir [, anahtar])
max (arg1, arg2, * args [, anahtar])
Yinelenebilir bir öğedeki en büyük öğeyi veya iki veya daha fazla bağımsız değişkenin en büyüğünü döndürür.

Bir konumsal argüman sağlanırsa, yinelenebilir boş olmayan bir yinelenebilir olmalıdır (boş olmayan bir dize, tuple veya liste gibi). Yinelemedeki en büyük öğe iade edilir. İki veya daha fazla konum bağımsız değişkeni sağlanırsa, konum bağımsız değişkenlerinin en büyüğü döndürülür.

İsteğe bağlı anahtar bağımsız değişkeni list.sort () için kullanılan gibi bir bağımsız değişkenli sıralama işlevini belirtir. Anahtar bağımsız değişken, sağlandıysa, anahtar kelime biçiminde olmalıdır (örneğin, max (a, b, c, anahtar = işlev)).

Bunun söylediği, sizin durumunuzda, bu durumda bir liste sağladığınızdır players. Daha sonra maxişlev listedeki tüm öğeleri tekrarlar ve "maksimum" elde etmek için bunları birbirleriyle karşılaştırır.

Tahmin edebileceğiniz gibi player, karşılaştırma için değerini belirlemek gibi karmaşık bir nesne ile zor, bu nedenle işlevin her birinin değerine keynasıl maxkarar vereceğini belirlemek için argüman verilir player. Bu durumda, lambda işlevini kullanarak "elde edilen her pbiri playersiçin p.totalscoreve bunu karşılaştırma değeri olarak kullanın " demek için kullanıyorsunuz.


3

maxilk bağımsız değişkeni alan bir iterableliste (liste veya grup gibi)

anahtar kelime bağımsız değişkeninin keyvarsayılan değeri vardır, Noneancak değerlendirilecek işlevi kabul eder, işlevi temel alarak yinelenebilir olarak değerlendiren sarmalayıcı olarak kabul eder

Şu örnek sözlüğü ele alalım:

d = {'aim':99, 'aid': 45, 'axe': 59, 'big': 9, 'short': 995, 'sin':12, 'sword':1, 'friend':1000, 'artwork':23}

Ör:

>>> max(d.keys())
'sword'

Eğer sadece kwarg (bir işlev key) olmadan yinelenebilir geçirip geçiremeyeceğinizi görebileceğiniz gibi, anahtarın maksimum değerini (alfabetik olarak) döndürüyor

Ör. Anahtarın maksimum değerini alfabetik olarak bulmak yerine, anahtarın uzunluğuna göre maksimum anahtarı bulmanız gerekebilir:

>>>max(d.keys(), key=lambda x: len(x))
'artwork'

Bu örnekte lambda işlevi, değerleri alfabetik olarak değerlendirmek yerine değerlendirirken yinelenecek olan anahtarın uzunluğunu döndürüyor, anahtarın maksimum uzunluğunu ve maksimum uzunluğa sahip olan anahtarı

Ör.

>>> max(d.keys(), key=lambda x: d[x])
'friend'

bu örnekte lambda işlevi, maksimum değere sahip karşılık gelen sözlük anahtarının değerini döndürüyor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.