2012-03-24 40 views
12

Tôi đang sử dụng hàm max của Python để tìm số nguyên lớn nhất trong từ điển có tên là count và khóa tương ứng (không chắc chắn lắm nếu tôi nói đúng); tốt hơn là tôi giải thích nó). Từ điển count nằm dọc theo các dòng {'a': 100, 'b': 210}, v.v.Sử dụng tối đa của Python để trả về hai giá trị lớn bằng nhau

number = count[max(count.items(), key=operator.itemgetter(1))[0]] 
highest = max(count, key=count.get) 

Tôi sẽ làm gì nếu có hai giá trị lớn nhất bằng nhau? Nếu tôi có {'a': 120, 'b': 120, 'c': 100}, điều này sẽ chỉ tìm thấy đầu tiên của ab, không phải cả hai.

+0

Những gì bạn làm dường như quá phức tạp. Ví dụ về Fox: 'number = max (count.values ​​())'. –

+0

Tôi không thể chống lại một lớp lót cho các loại câu hỏi này 'cao nhất, số = giảm (lambda a, b: a [0] .append (b [0]) hoặc (a [0], b [1]) nếu b [1] == a [1] người khác (([b [0]], b [1]) nếu b [1]> a [1] khác a), count.iteritems(), ([], -1)) ' –

Trả lời

23

Idea là tìm giá trị tối đa và nhận được tất cả các phím tương ứng với giá trị mà:

count = {'a': 120, 'b': 120, 'c': 100} 

highest = max(count.values()) 

print([k for k, v in count.items() if v == highest]) 
+0

Bạn có thể giải thích một chút về những gì Python đang làm ở đây không? Tôi khá mới với nó. – kidosu

+1

1. count.values ​​() trả về danh sách các giá trị, ví dụ: [120, 120, 100]. 2. max (count.values ​​()) trả về giá trị tối đa từ danh sách, ví dụ: 120. 3. count.items() trả về một danh sách (key, value) tuple, ví dụ: [('a', 120), ('b', 120), ('c', 100)]. Dòng cuối cùng được gọi là danh sách hiểu. Bạn có thể viết lại mã giống như sau. Lặp lại các cặp (khóa, giá trị) trong từ điển và nếu giá trị là cao nhất, sau đó thêm khóa vào danh sách. – Asterisk

+0

Cảm ơn bạn! Có cách nào không in dấu ngoặc vuông không? – kidosu

0

Đây có thể là một cách (có lẽ không phải là hiệu quả nhất).

value = max(count.values()) 
filter(lambda key: count[key]==value,count) 
1

nhanh vượt qua duy nhất:

a = { 'a': 120, 'b': 120, 'c': 100 } 
z = [0] 
while a: 
    key, value = a.popitem() 
    if value > z[0]: 
     z = [value,[key]] 
    elif value == z[0]: 
     z[1].append(key) 

print z 
#output: 
[120, ['a', 'b']] 

Và một cách thú vị với defualtdict:

import collections 
b = collections.defaultdict(list) 
for key, value in a.iteritems(): 
    b[value].append(key) 
print max(b.items()) 
#output: 
(120, ['a', 'b']) 
+0

Là kết quả trung gian, bạn có một bản đồ (giá trị -> [phím]) cho tất cả các giá trị. Thực tế này (cấu trúc dữ liệu bổ sung) làm cho nó khá chậm (nhưng khá thanh lịch). – Tupteq

2

Cùng ý tưởng như Asterisk, nhưng không lặp lại trên danh sách hai lần. Bit tiết hơn.

count = { 'a': 120, 'b': 120, 'c': 100 } 
answers = [] 
highest = -1 

def f(x): 
    global highest, answers 
    if count[x] > highest: 
     highest = count[x] 
     answers = [x] 
    elif count[x] == highest: 
     answers.append(x) 

map(f, count.keys()) 
print answers 
0

giải pháp Đôi khi đơn giản nhất có thể là tốt nhất:

max_value = 0 
max_keys = [] 

for k, v in count.items(): 
    if v >= max_value: 
     if v > max_value: 
      max_value = v 
      max_keys = [k] 
     else: 
      max_keys.append(k) 

print max_keys 

Đoạn mã trên là nhanh hơn một chút so với hai đường chuyền giải pháp như:

highest = max(count.values()) 
print [k for k,v in count.items() if v == highest] 

Tất nhiên nó lâu hơn, nhưng mặt khác tay nó rất rõ ràng và dễ đọc.

+0

Tôi quên đề cập đến - đây là một giải pháp Python 3.x, bạn đang sử dụng Python 2.x, bạn nên thay thế count.items() bằng count.iteritems(). – Tupteq

+0

Giá trị không có gì 'count.items()' sẽ làm việc trong Python 2.x là tốt (mặc dù không hiệu quả). –

0

Để in danh sách không có nhóm. sử dụng:

' '.join(map(str, mylist)) 

hoặc, một cách chi tiết hơn:

' '.join(str(x) for x in mylist) 
Các vấn đề liên quan