Bir Python sözlüğüm varsa, minimum değeri içeren girişin anahtarını nasıl alabilirim?
Bu min()
işlevle ilgili bir şeyler düşünüyordum ...
Girdi verildiğinde:
{320:1, 321:0, 322:3}
Dönecekti 321
.
Bir Python sözlüğüm varsa, minimum değeri içeren girişin anahtarını nasıl alabilirim?
Bu min()
işlevle ilgili bir şeyler düşünüyordum ...
Girdi verildiğinde:
{320:1, 321:0, 322:3}
Dönecekti 321
.
Yanıtlar:
En iyi: min(d, key=d.get)
- yararsız bir lambda
dolaylama katmanı araya veya öğeleri veya anahtarları ayıklamak için bir sebep yok !
[11, 22, 33]
bir sözlük yerine, örneğin bir liste "d" olarak geçti anlamına gelir {1: 11, 2:22, 3:33}
. 'd.get' sözlük için geçerlidir, ancak liste için geçerli değildir.
d={"a":[10, None], "b":[20, None]}
min, d [key] [0] 'dan hesaplanır mı?
min()
ilk değerdeki değeri sıralanmış olarak döndürür. tuşu, değerleri sıralamanın yolunu belirler. key=d.get
listenin sözlüğün değerlerine göre sıralanacağı anlamına gelir.
İşte OP'nin istediği çözümü veren bir cevap:
>>> d = {320:1, 321:0, 322:3}
>>> d.items()
[(320, 1), (321, 0), (322, 3)]
>>> # find the minimum by comparing the second element of each tuple
>>> min(d.items(), key=lambda x: x[1])
(321, 0)
d.iteritems()
Bununla birlikte, daha büyük sözlükler için kullanmak daha verimli olacaktır.
operator.itemgetter(1)
.
Eşit en düşük değere sahip birden fazla anahtar için bir liste kavrama kullanabilirsiniz:
d = {320:1, 321:0, 322:3, 323:0}
minval = min(d.values())
res = [k for k, v in d.items() if v==minval]
[321, 323]
Eşdeğer bir işlevsel versiyon:
res = list(filter(lambda x: d[x]==minval, d))
>>> d = {320:1, 321:0, 322:3}
>>> min(d, key=lambda k: d[k])
321
key=d.get
daha iyidir.
Birden çok minimal anahtarınız olduğu ve basit tutmak istediğiniz durumda
def minimums(some_dict):
positions = [] # output variable
min_value = float("inf")
for k, v in some_dict.items():
if v == min_value:
positions.append(k)
if v < min_value:
min_value = v
positions = [] # output variable
positions.append(k)
return positions
minimums({'a':1, 'b':2, 'c':-1, 'd':0, 'e':-1})
['e', 'c']
Birden fazla minimum değeriniz olmadığından emin değilseniz şunları öneririm:
d = {320:1, 321:0, 322:3, 323:0}
print ', '.join(str(key) for min_value in (min(d.values()),) for key in d if d[key]==min_value)
"""Output:
321, 323
"""
Düzenleme: Bu OP'nin asgari anahtarla ilgili asıl sorunun cevabıdır, minimal cevap değildir.
Bu keys
işlevi kullanarak diktenin anahtarlarını alabilirsiniz ve min
bu listenin minimumunu bulmak için kullanmakta haklısınız .
Aynı min değerine sahip birden çok anahtar sorununu ele almak için başka bir yaklaşım:
>>> dd = {320:1, 321:0, 322:3, 323:0}
>>>
>>> from itertools import groupby
>>> from operator import itemgetter
>>>
>>> print [v for k,v in groupby(sorted((v,k) for k,v in dd.iteritems()), key=itemgetter(0)).next()[1]]
[321, 323]
min
Bir yineleyici ile kullanın ( items
yerine python 3 kullanımı için iteritems
); lambda yerine lambda'dan itemgetter
daha hızlı olan operatörden kullanın .
from operator import itemgetter
min_key, _ = min(d.iteritems(), key=itemgetter(1))
d={}
d[320]=1
d[321]=0
d[322]=3
value = min(d.values())
for k in d.keys():
if d[k] == value:
print k,d[k]
Aşağıdaki üç seçeneğin nasıl performans gösterdiğini karşılaştırdım:
import random, datetime
myDict = {}
for i in range( 10000000 ):
myDict[ i ] = random.randint( 0, 10000000 )
# OPTION 1
start = datetime.datetime.now()
sorted = []
for i in myDict:
sorted.append( ( i, myDict[ i ] ) )
sorted.sort( key = lambda x: x[1] )
print( sorted[0][0] )
end = datetime.datetime.now()
print( end - start )
# OPTION 2
start = datetime.datetime.now()
myDict_values = list( myDict.values() )
myDict_keys = list( myDict.keys() )
min_value = min( myDict_values )
print( myDict_keys[ myDict_values.index( min_value ) ] )
end = datetime.datetime.now()
print( end - start )
# OPTION 3
start = datetime.datetime.now()
print( min( myDict, key=myDict.get ) )
end = datetime.datetime.now()
print( end - start )
Örnek çıktı:
#option 1
236230
0:00:14.136808
#option 2
236230
0:00:00.458026
#option 3
236230
0:00:00.824048
düzenlenebilir bir sınıf oluşturmak için min () işlevi tarafından çağrılacak şekilde 6 özel işlevi geçersiz kılmanız gerekir
bu yöntemler sırasıyla __lt__ , __le__, __gt__, __ge__, __eq__ , __ne__
küçük, eşit ya da eşit, büyük, eşit ya da eşit, eşit, eşit değildir. örneğin __lt__
aşağıdaki gibi uygulama yapmalısınız :
def __lt__(self, other):
return self.comparable_value < other.comparable_value
min işlevini aşağıdaki gibi kullanabilirsiniz:
minValue = min(yourList, key=(lambda k: yourList[k]))
bu benim için çalıştı.
min(zip(d.values(), d.keys()))[1]
Değerler ve anahtarlar içeren bir tuples yinelemesi oluşturmak için zip işlevini kullanın. Ardından, ilk tuşa dayanarak minimum değeri alan bir min işleviyle sarın. Bu, (değer, anahtar) çifti içeren bir demet döndürür. [1] dizini ilgili anahtarı almak için kullanılır
# python
d={320:1, 321:0, 322:3}
reduce(lambda x,y: x if d[x]<=d[y] else y, d.iterkeys())
321
min()
) yerleşik bir şeyi yeniden uygulamaya gerek yoktur .
Aradığınız bu mu?
d = dict()
d[15.0]='fifteen'
d[14.0]='fourteen'
d[14.5]='fourteenandhalf'
print d[min(d.keys())]
'On dört' yazdırır