我正在尝试从我从csv文件制作的字典中提取一组随机的键值对。字典包含基因信息,基因名称是字典键,数字列表(与基因表达等相关)是值。
# python 2.7.5
import csv
import random
genes_csv = csv.reader(open('genes.csv', 'rb'))
genes_dict = {}
for row in genes_csv:
genes_dict[row[0]] = row[1:]
length = raw_input('How many genes do you want? ')
for key in genes_dict:
random_list = random.sample(genes_dict.items(), int(length))
print random_list
问题是,如果我试图得到100个基因的列表(例如),它似乎遍历整个字典并返回100个基因的每个可能组合。
答案 0 :(得分:14)
如果您想从字典K
中获取随机D
元素,只需使用
import random
random.sample( D.items(), K )
这就是你所需要的。
来自Python的文档:
随机。示例(人口, k )
返回 k 长度的唯一元素列表 从种群序列中选择。用于随机抽样而不用 更换。
在你的情况下
import csv
import random
genes_csv = csv.reader(open('genes.csv', 'rb'))
genes_dict = {}
for row in genes_csv:
genes_dict[row[0]] = row[1:]
length = raw_input('How many genes do you want? ')
random_list = random.sample( genes_dict.items(), int(length) )
print random_list
无需遍历字典的所有键
for key in genes_dict:
random_list = random.sample(genes_dict.items(), int(length))
print random_list
请注意,您实际上并未在循环中使用key
变量,这应警告您此处可能存在错误。虽然不真实它“返回100个基因的每个可能的组合。”,它只返回N
随机k
元素基因列表(在您的情况下为100),其中N
是字典的大小,远不是“所有组合”(N!/(N-k)!k!
)
答案 1 :(得分:2)
for key in genes_dict:
random_list = random.sample(genes_dict.items(), int(length))
print random_list
遍历每个键,每个键打印一个样本。你正在寻找
random_list = random.sample(genes_dict.items(), int(length))
print random_list
答案 2 :(得分:0)
我同意其他人不需要使用字典键进行迭代。但是,如果您不希望将格式作为元组返回,而是作为列表返回,则可以使用
random_list=genes_dict.keys() int(length)
然后,如果“int(length)”多于一个,则为循环获取值:
for x in random_list:
print x,genes_dict[x]
//or to create a new dict of the random values you could
random_genes_dict[x]=genes_dict[x]