2015-11-01 12 views
5

Từ thử nghiệm tôi đã lưu ý rằng khi trong trường hợp cà vạt, chọn trăn dựa trên đơn đặt hàng (ví dụ: mặt hàng có trong danh sách đầu tiên) Có cách nào không, trong trường hợp nào tôi có thể chọn một mục ngẫu nhiên, để nó không phải là xác định và dựa trên thứ tự?Chọn ngẫu nhiên tối đa trong trường hợp cà vạt?

ví dụ:

l = [ ([1], 10) , ([2], 3), ([3], 9), ([4], 10)] 
max(l, key=lambda x: x[1]) 

mỗi lần chạy này, hoặc có thể trở lại ([4], 10) hoặc ([1], 10) và không phải lúc nào ([1], 10)

+0

Tôi không nghĩ rằng bạn có thể làm điều đó trực tiếp (ví dụ, nói 'max 'để làm điều đó một cách ngẫu nhiên) nhưng bạn có thể làm một' max' theo sau là một 'bộ lọc' theo sau là một' random.choice'. – 5gon12eder

Trả lời

3

Bạn sẽ cần phải tìm tất cả của max đầu tiên sau đó chọn một cách ngẫu nhiên:

from operator import itemgetter 
from random import choice 

l = [([1], 10) , ([2], 3), ([3], 9), ([4], 10)] 

mx = max(l, key=itemgetter(1)) 

all_maxes = [ele for ele in l if ele[1] == mx[1]] 

print(choice(all_maxes)) 
5

Xáo danh sách trước khi chọn tối đa:

import random 
random.shuffle(l) 
3

Bạn có thể thêm al ittle ngẫu nhiên với giá trị chính:

max(l, key=lambda x: x[1] + random.random()) 

Hoặc tổng quát hơn, trong trường hợp các phím của bạn không phải là chỉ số nguyên:

max(l, key=lambda x: (x[1], random.random())) 
+1

Điều đó có thể (nói chung) khiến mục không tối đa vượt quá mức tối đa thực sự. – chepner

+0

làm thế nào nó có thể làm cho một mục không tối đa vượt quá mức tối đa thực sự? Tôi vừa chạy nhiều lần lặp lại và trong mỗi lần lặp lại, giá trị tối đa có vẻ đúng là – user

+1

@user, .7 được thêm vào 2.5 và .1 được thêm vào 3, giá trị nào sẽ được trả lại tối đa? Nó là ok với số nguyên nhưng như chepner nói nói chung không phải là một cách tiếp cận tốt –

Các vấn đề liên quan