Jika saya memiliki kamus Python, bagaimana cara mendapatkan kunci entri yang berisi nilai minimum?
Saya sedang memikirkan sesuatu untuk dilakukan dengan min()
fungsi ...
Diberikan input:
{320:1, 321:0, 322:3}
Itu akan kembali 321
.
Jika saya memiliki kamus Python, bagaimana cara mendapatkan kunci entri yang berisi nilai minimum?
Saya sedang memikirkan sesuatu untuk dilakukan dengan min()
fungsi ...
Diberikan input:
{320:1, 321:0, 322:3}
Itu akan kembali 321
.
Jawaban:
Terbaik: min(d, key=d.get)
- tidak ada alasan untuk menempatkan lambda
lapisan tipuan yang tidak berguna atau mengekstrak item atau kunci!
[11, 22, 33]
, bukan kamus misalnya {1: 11, 2:22, 3:33}
. 'd.get' valid untuk kamus, tetapi tidak untuk daftar.
d={"a":[10, None], "b":[20, None]}
mana min dihitung dari d [kunci] [0]?
min()
kembalikan nilai pada nilai pertama diurutkan. kunci menentukan cara untuk mengurutkan nilai. key=d.get
berarti daftar akan diurutkan berdasarkan nilai kamus.
Inilah jawaban yang benar-benar memberikan solusi yang diminta OP:
>>> 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)
Namun, penggunaan d.iteritems()
akan lebih efisien untuk kamus yang lebih besar.
operator.itemgetter(1)
.
Untuk beberapa kunci yang memiliki nilai terendah yang sama, Anda dapat menggunakan pemahaman daftar:
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]
Versi fungsional yang setara:
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
lebih baik.
Untuk kasus di mana Anda memiliki beberapa kunci minimal dan ingin membuatnya tetap sederhana
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']
Jika Anda tidak yakin bahwa Anda tidak memiliki beberapa nilai minimum, saya sarankan:
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
"""
Sunting: ini adalah jawaban untuk pertanyaan awal OP tentang kunci minimal, bukan jawaban minimal.
Anda bisa mendapatkan kunci dikt menggunakan keys
fungsi, dan Anda benar tentang menggunakan min
untuk menemukan minimum daftar itu.
Pendekatan lain untuk mengatasi masalah beberapa kunci dengan nilai min yang sama:
>>> 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]
Gunakan min
dengan iterator (untuk penggunaan python 3 items
bukan iteritems
); bukannya lambda gunakan itemgetter
dari operator, yang lebih cepat dari lambda.
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]
Saya membandingkan kinerja tiga opsi berikut:
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 )
Output sampel:
#option 1
236230
0:00:14.136808
#option 2
236230
0:00:00.458026
#option 3
236230
0:00:00.824048
untuk membuat kelas yang dapat dipesan, Anda harus mengganti 6 fungsi khusus, sehingga akan dipanggil oleh fungsi min ()
metode-metode ini __lt__ , __le__, __gt__, __ge__, __eq__ , __ne__
agar mereka kurang dari, kurang dari atau sama, lebih besar dari, lebih besar dari atau sama, sama, tidak sama. misalnya Anda harus menerapkan __lt__
sebagai berikut:
def __lt__(self, other):
return self.comparable_value < other.comparable_value
maka Anda dapat menggunakan fungsi min sebagai berikut:
minValue = min(yourList, key=(lambda k: yourList[k]))
ini berhasil untuk saya.
min(zip(d.values(), d.keys()))[1]
Gunakan fungsi zip untuk membuat iterator tuple yang berisi nilai dan kunci. Kemudian bungkus dengan fungsi min yang mengambil minimum berdasarkan kunci pertama. Ini mengembalikan tuple yang berisi pasangan (nilai, kunci). Indeks [1] digunakan untuk mendapatkan kunci yang sesuai
# python
d={320:1, 321:0, 322:3}
reduce(lambda x,y: x if d[x]<=d[y] else y, d.iterkeys())
321
min()
).
Apa ini yang kamu cari?
d = dict()
d[15.0]='fifteen'
d[14.0]='fourteen'
d[14.5]='fourteenandhalf'
print d[min(d.keys())]
Cetakan 'empat belas'