从嵌套在列表中的每个列表中,它们之间的不同选择一个随机项,并生成列表的n倍(重采样)
问题描述:
我有通过类似于这种结构的制表符分隔genecodes txt文件:从嵌套在列表中的每个列表中,它们之间的不同选择一个随机项,并生成列表的n倍(重采样)
ENSG00000111111 ENSG00000111111 ENSG00000111111 ENSG00000111555
ENSG00000111111 ENSG00000111111 ENSG00000111111 ENSG00000111222
ENSG00000111111 ENSG00000111111 ENSG00000111111 ENSG00000333555
我想创建一个列表从每行中随机选择一个项目和选定的项目必须是不同之间他们。在端欲重复该过程n次,以便获得具有这种结构的输出文件:
ENSG00000111111 ENSG00000111222 ENSG00000333555
ENSG00000111555 ENSG00000111222 ENSG00000333555
ENSG00000111555 ENSG00000111222 ENSG00000111111
...
(每行对应于随机项中的每个生成的列表) 。目前,我有这样的脚本: 其中:all_cand是与我的脚本TXT输入文件
#!/usr/bin/python
import sys
import os
import random
from itertools
import numpy as np
def rand_cand (all_cand):
cand_list= []
main_list = []
cand_file= open(all_cand, "r")
for _ in itertools.repeat(None, 10):
for line in cand_file:
cand_rows = line.split()
cand_list.append(cand_rows)
for item in cand_list:
aux_old = np.random.choice(item, replace=False)
if not aux_old in main_list:
main_list.append(aux_old)
else:
aux_new = np.random.choice(item, replace=False)
main_list.append(aux_new)
print(main_list)
,每次生成的列表中包含的重复,我认为这是由于如果循环。我尝试在将要附加到列表中的那些已经存储的每一个项目比较,但它没有......所以我错了一个输出为:
ENSG00000111111 ENSG00000111111 ENSG00000111111
ENSG00000111111 ENSG00000111111 ENSG00000111222
ENSG00000111111 ENSG00000111111 ENSG00000111111
ENSG00000111555 ENSG00000111111 ENSG00000111111
...
感谢事先!我希望清楚我的问题
答
我没有测试它尚未的解释,但是这应该这样做
import csv
import itertools
import random
with open('file.txt') as infile:
data = list(csv.reader(infile, delimiter='\t'))
answer = []
combos = list(itertools.combinations_with_replacement([0,1,2,3], 3))
for _ in range(n):
selection = []
while len(set(selection)) != 3:
inds = random.choice(combos)
rows = random.sample(data, 3)
selection = [row[i] for i,row in zip(inds, rows)]
answer.append(selection)
谢谢您的回答。我已经使用过你的脚本,但它没有给出任何结果...... – Gaferolo
@Gaferolo:那里有一个小错误。现在已经修复了。一探究竟! – inspectorG4dget
我已经改变了这个小错误,但它仍然无法正常工作。你有没有测试过它? – Gaferolo