6

我试图从我用 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 个基因的每个可能组合。

4

3 回答 3

17

如果您想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!

于 2013-09-23T09:19:02.240 回答
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
于 2013-09-23T09:18:55.860 回答
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]
于 2014-01-27T18:48:55.723 回答