2012-07-27 61 views
2

我想基于输入数据集来构建随机数据集。 输入数据集由856471行组成,每行中有一对由制表符分隔的值。 从随机数据集NO条目可以等于任何那些在输入数据集的,这意味着:在Python中使用随机模块中的选项时出错

如果对在第1行是“蛋白1蛋白2”时,随机数据集不能包含以下对:

  • “蛋白1蛋白2”
  • “蛋白2蛋白1”

为了实现这一点,我尝试了以下内容:

data = infile.readlines() 
ltotal = len(data) 
for line in data: 
    words = string.split(line) 

init = 0 
while init != ltotal: 
    p1 = random.choice(words) 
    p2 = random.choice(words) 
    words.remove(p1) 
    words.remove(p2) 
    if "%s\t%s\n" % (p1, p2) not in data and "%s\t%s\n" % (p2, p1) not in data: 
     outfile.write("%s\t%s\n" % (p1, p2)) 

不过,我发现了以下错误:

Traceback (most recent call last): File 
"C:\Users\eduarte\Desktop\negcreator.py", line 46, in <module> 
    convert(indir, outdir) File "C:\Users\eduarte\Desktop\negcreator.py", line 27, in convert 
    p1 = random.choice(words) File "C:\Python27\lib\random.py", line 274, in choice 
    return seq[int(self.random() * len(seq))] # raises IndexError if seq is empty 
IndexError: list index out of range 

我敢肯定这会工作。我究竟做错了什么? 在此先感谢。

回答

1

变量words被改写为各行内循环

for line in data: 
    words = string.split(line) 

这是最有可能不是你想要的。

此外,您的while循环是一个无限循环,最终将消耗words,不会为random.choice()留下任何选择。

编辑:我的猜测是,你有制表符分隔的词对的文件,每行一对,你正试图形成从所有的话随机对,写作只有那些随机配对向输出文件不在原始文件中出现。下面是一些代码这样做:

import itertools 
import random 
with open("infile") as infile: 
    pairs = set(frozenset(line.split()) for line in infile) 
words = list(itertools.chain.from_iterable(pairs)) 
random.shuffle(words) 
with open("outfille", "w") as outfile: 
    for pair in itertools.izip(*[iter(words)] * 2): 
     if frozenset(pair) not in pairs: 
      outfile.write("%s\t%s\n" % pair) 

注:

  1. 一对字由frozenset表示时,由于顺序无关紧要。

  2. 我使用set为所有对能够测试一对是否在恒定时间集合。

  3. 而不是重复使用random.choice(),我只洗一次整个列表,然后成对地遍历它。这样,我们不需要从列表中删除已经使用的单词,因此效率更高。 (这个变化的前一个打倒方法的算法复杂度从O(N²)至O(N)。)

  4. 表达itertools.izip(*[iter(words)] * 2)是一种常见的Python的成语来遍历成对words,万一你没有遇到那个呢。

  5. 该代码仍未测试。

+0

嘿!抱歉回复晚了。是的,那条线真的很愚蠢。 但即使我应用了您的建议并对其进行了一些修改,但仍然无法完成工作。编辑:哦,它不工作的方式,我得到了同样的错误,我得到的第一个地方。 – 2012-07-28 11:11:05

+0

@EdwardCoelho:我不清楚你的代码实际上应该做什么。我想我现在明白了,并添加了新版本的代码。 – 2012-07-28 11:42:21

+0

哦,对不起。我认为我的解释很好。猜猜我还没有像一个程序员那样思考。但是,是的,你知道我在想什么,那太棒了!现在它的运行速度也非常快。只有两个注释:'frozenset(pair)'不应该在'pais'中,我已经克服了这个问题。其他的事情,你如何限制生成的总数?我想要在两个文件中具有相同的行数。我使用'len()'来获取infile中的所有行,但即使使用if语句也不会改变。 – 2012-07-28 13:03:39