1

入力データセットに基づいてランダム化されたデータセットを構築しようとしています。入力データセットは856471行で構成され、各行にはタブで区切られた値のペアがあります。ランダム化されたデータセットからのエントリは、入力データセットのエントリと同じにすることはできません。これは、次のことを意味します。

1行目のペアが「Protein1Protein2」の場合、ランダム化されたデータセットに次のペアを含めることはできません。

  • 「Protein1Protein2」
  • 「Protein2Protein1」

これを達成するために、私は以下を試しました:

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

私はこれがうまくいくとかなり確信していました。私は何が間違っているのですか?前もって感謝します。

4

1 に答える 1

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ペアが一定時間でセットに含まれるかどうかをテストできるように、すべてのペアにaを使用します。

  3. 繰り返し使用する代わりに、random.choice()リスト全体を1回だけシャッフルしてから、ペアで繰り返します。このように、すでに使用されている単語をリストから削除する必要がないため、はるかに効率的です。(この変更は前の変更であり、アプローチのアルゴリズムの複雑さをO(n²)からO(n)に下げます。)

  4. この式は、まだ遭遇していない場合に備えて、ペアでitertools.izip(*[iter(words)] * 2)反復する一般的なPythonイディオムです。words

  5. コードはまだテストされていません。

于 2012-07-27T16:34:43.473 に答える