我试图基于输入数据集构建一个随机数据集。 输入数据集由856471行组成,每行有一对值,用制表符分隔。 随机数据集中的任何条目都不能与输入数据集中的任何条目相等,这意味着:
如果第1行中的对是“Protein1 Protein2”,则随机数据集不能包含以下对:
为了达到这个目的,我尝试了以下方法:
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}$我很肯定这会奏效的。我做错什么了? 提前谢谢。在
对于循环中的每一行,变量
words
被覆盖这很可能不是你想要的。在
此外,您的}的选择。在
while
循环是一个无限循环,它最终将消耗words
,没有留给{编辑:我猜你有一个由制表符分隔的单词对组成的文件,每行有一对,你试图从所有单词组成随机对,只将那些不在原始文件中出现的随机对写入输出文件。下面是一些代码:
^{pr2}$注意事项:
一对单词用
frozenset
表示,因为顺序并不重要。我对所有的对使用
set
来测试一对是否在固定时间内位于集合中。我没有重复使用
random.choice()
,而是只对整个列表进行一次洗牌,然后成对地对其进行迭代。这样,我们就不需要从列表中删除已经使用过的单词,因此效率更高。(与前一个方法相比,这一更改将该方法的算法复杂度从O(n²)降低到O(n)。表达式
itertools.izip(*[iter(words)] * 2)
是一种常见的Python习惯用法,可以成对地在words
上迭代,以防您还没有遇到它。该代码尚未测试。
相关问题 更多 >
编程相关推荐