在Python中使用随机模块选项时出错

2024-05-20 14:17:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图基于输入数据集构建一个随机数据集。 输入数据集由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))

但是,我得到了以下错误:

^{pr2}$

我很肯定这会奏效的。我做错什么了? 提前谢谢。在


Tags: 数据indatainitlinenot条目random
1条回答
网友
1楼 · 发布于 2024-05-20 14:17:29

对于循环中的每一行,变量words被覆盖

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

这很可能不是你想要的。在

此外,您的while循环是一个无限循环,它最终将消耗words,没有留给{}的选择。在

编辑:我猜你有一个由制表符分隔的单词对组成的文件,每行有一对,你试图从所有单词组成随机对,只将那些不在原始文件中出现的随机对写入输出文件。下面是一些代码:

^{pr2}$

注意事项:

  1. 一对单词用frozenset表示,因为顺序并不重要。

  2. 我对所有的对使用set来测试一对是否在固定时间内位于集合中。

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

  4. 表达式itertools.izip(*[iter(words)] * 2)是一种常见的Python习惯用法,可以成对地在words上迭代,以防您还没有遇到它。

  5. 该代码尚未测试。

相关问题 更多 >