我有以下随机选择脚本:
import random
length_of_list = 200
my_list = list(range(length_of_list))
num_selections = 10
numbers = random.sample(my_list, num_selections)
它查看预定大小的列表并随机选择10个数字。有没有办法运行这个部分500次,然后获得最多被选中的前10个数字?我想我可以将数字输入字典然后从那里获得前10个数字。到目前为止,我已经完成了以下工作:
for run in range(0, 500):
numbers = random.sample(my_list, num_selections)
for number in numbers:
current_number = my_dict.get(number)
key_number = number
my_dict.update(number = number+1)
print(my_dict)
在这里,我希望代码获取分配给该密钥的当前编号,然后添加1,但我无法使其工作。似乎字典更新的关键必须是那个特定的键,不能插入一个变量..而且,我认为这个嵌套循环可能不是那么高效,因为我必须运行500次1500次23 ...所以我担心表现。如果有人知道我应该尝试什么,那就太好了!谢谢
解:
import random
from collections import defaultdict
from collections import OrderedDict
length_of_list = 50
my_list = list(range(length_of_list))
num_selections = 10
my_dict = dict.fromkeys(my_list)
di = defaultdict(int)
for run in range(0, 500):
numbers = random.sample(my_list, num_selections)
for number in numbers:
di[number] += 1
def get_top_numbers(data, n, order=False):
"""Gets the top n numbers from the dictionary"""
top = sorted(data.items(), key=lambda x: x[1], reverse=True)[:n]
if order:
return OrderedDict(top)
return dict(top)
print(get_top_numbers(di, n=10))
检查收集模块的defaultdict,所以基本上,你创建一个默认值为defaultdict
的0
,然后迭代你的numbers
列表并将数字的值更新为+=1
from collections import defaultdict
di = defaultdict(int)
for run in range(0, 500):
numbers = random.sample(my_list, num_selections)
for number in numbers:
di[number] += 1
print(di)
my_dict.update(number = number+1)
在这一行中,您正在为函数调用的括号内的变量赋值。除非你给这个函数一个名为kwarg的number
值为number+1
,否则会出现以下错误:TypeError: 'number' is an invalid keyword argument for this function
dict.update
也不接受整数而是另一个字典。你应该阅读有关这个函数的文档:https://www.tutorialspoint.com/python3/dictionary_update.htm这里说它的dict.update(dict2)
需要一个字典,它将整合到dict
中。见下面的例子:
dict = {'Name': 'Zara', 'Age': 7}
dict2 = {'Sex': 'female' }
dict.update(dict2)
print ("updated dict : ", dict)
结果如下:updated dict : {'Sex': 'female', 'Age': 7, 'Name': 'Zara'}
到目前为止,对于代码中的错误,我看到已经给出了一个很好的答案,所以我不会重复他。
您可以使用此任务collections.Counter
提供添加方法。因此,您将使用两个计数器,一个是all和sum的总和,其中包含样本计数。
counter = collections.Counter()
for run in range(500):
samples = random.sample(my_list, num_samples)
sample_counter = collections.Counter(samples)
counter = counter + sample_counter