python - 在 Python 中使用随机模块的选择时出错

标签 python random error-handling

我正在尝试基于输入数据集构建随机数据集。 输入数据集由 856471 行组成,每行都有一对由制表符分隔的值。 随机数据集中的条目不能与输入数据集中的任何条目相同,这意味着:

如果第 1 行中的对是“Protein1 Protein2”,则随机数据集不能包含以下对:

  • “蛋白质 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

我非常确定这会起作用。我究竟做错了什么? 提前致谢。

最佳答案

循环中的每一行都会覆盖变量 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. 我对所有对使用一个集合,以便能够在恒定时间内测试一对是否在集合中。

  3. 我没有重复使用random.choice(),而是只对整个列表进行一次洗牌,然后成对迭代它。这样,我们不需要从列表中删除已经使用的单词,因此效率更高。 (这一变化与之前的变化相比,将该方法的算法复杂度从 O(n²) 降低到了 O(n)。)

  4. 表达式 itertools.izip(*[iter(words)] * 2) 是一种常见的 Python 习惯用法,用于成对迭代 words,以防万一你还没有遇到过那个人。

  5. 代码尚未经过测试。

关于python - 在 Python 中使用随机模块的选择时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11691964/

相关文章:

python - 如何使用python在postgres中获取插入或选择的行ID

c - qsort 是否需要一致的比较,或者我可以用它来洗牌吗?

c++ - 关于 WINAPI 错误处理

java - 由 : java. lang.IllegalArgumentException : Binary XML file line #9: Must specify unique android:id, android :tag, 引起,或者有一个 id 为

python - 打开街道 map (pyproj)。如何解决语法问题?

python - 在使用 Python 删除之前终止文件进程

Python - Mechanize/请求获取标题

algorithm - 从一组中获取 X 个唯一数字

php - 随机 map 生成器 - 在网格上创建区域

javascript - 是否可以处理 javascript 中的所有异常,以便在浏览器控制台中不显示错误?