从python中的字典中获取随机键:值对

Tim*_*art 4 python csv random dictionary

我试图从我用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
Run Code Online (Sandbox Code Playgroud)

问题是,如果我试图得到100个基因的列表(例如),它似乎迭代整个字典并返回100个基因的每个可能的组合.

lej*_*lot 14

如果你想K从字典中获取随机元素,D你只需使用

import random
random.sample( D.items(), K )
Run Code Online (Sandbox Code Playgroud)

这就是你所需要的.

从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
Run Code Online (Sandbox Code Playgroud)

无需遍历字典的所有键

for key in genes_dict:
    random_list = random.sample(genes_dict.items(), int(length))
    print random_list
Run Code Online (Sandbox Code Playgroud)

注意,你实际上没有使用key你的循环中的变量,这应该警告你这里可能有问题.虽然它"返回100个基因的所有可能组合" 并不是真的,但它只返回N随机k元素基因列表(在你的情况下为100),N字典的大小,这远不是"所有组合"(这是N!/(N-k)!k!)