我有以下随机选择脚本:
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))
答案 0 :(得分:4)
my_dict.update(number = number+1)
在此行中,您正在为函数调用括号内的变量分配新值。除非您为函数提供一个名为number
的{{1}},其值为number+1
,否则会出现以下错误:
TypeError: 'number' is an invalid keyword argument for this function
dict.update
也不接受整数,但接受另一个字典。您应该阅读有关此功能的文档:kwarg
这里说的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'}
到目前为止,对于您代码中的错误,我看到已经给出了很好的答案,所以我不再赘述。
答案 1 :(得分:2)
结帐模块defaultdict的结帐,
因此,基本上,您将创建一个默认值为defaultdict
的{{1}},然后遍历您的0
列表,并将数字的值更新为numbers
+=1
答案 2 :(得分:2)
您可以为此任务collections.Counter
使用,它提供了附加方法。因此,您将使用两个计数器,一个是所有计数器的和,另一个是包含样本计数的计数器。
counter = collections.Counter()
for run in range(500):
samples = random.sample(my_list, num_samples)
sample_counter = collections.Counter(samples)
counter = counter + sample_counter