tôi có một chương trình mà tôi đang theo dõi sự thành công của nhiều điều sử dụng collections.Counter
- mỗi thành công của một điều increments quầy tương ứng:Làm cách nào để có được một lựa chọn ngẫu nhiên có trọng số từ lớp Counter của Python?
import collections
scoreboard = collections.Counter()
if test(thing):
scoreboard[thing]+ = 1
Sau đó, đối với các bài kiểm tra trong tương lai, tôi muốn nghiêng về phía những thứ đã tạo ra thành công nhất. Counter.elements()
có vẻ lý tưởng cho điều này, vì nó trả về các phần tử (theo thứ tự tùy ý) lặp lại một số lần bằng số đếm. Vì vậy, tôi figured tôi chỉ có thể làm:
import random
nextthing=random.choice(scoreboard.elements())
Nhưng không, làm tăng Lỗi Loại: đối tượng của loại 'itertools.chain' không có người len(). Ok, vậy là random.choice
can't work with iterators. Nhưng, trong trường hợp này, chiều dài được biết (hoặc có thể biết) - đó là sum(scoreboard.values())
.
Tôi biết thuật toán cơ bản để lặp qua danh sách chiều dài không xác định và chọn ngẫu nhiên một phần tử ngẫu nhiên, nhưng tôi nghi ngờ rằng có điều gì đó thanh lịch hơn. Tôi nên làm gì ở đây?
Làm thế nào về chỉ quay 'scoreboard.elements()' vào danh sách? – delnan
@delnan - xem nhận xét về [câu trả lời của larsks] (http://stackoverflow.com/a/9084700/479426) bên dưới. – mattdm