1

シーケンスのいくつかの開始位置と終了位置(MANY!)を含むファイルがあり、開始位置と終了位置を選択し、開始位置から終了位置を引いて特定のシーケンスの長さを取得し、それをランダムに配置したい最小の開始番号と最大の終了番号の間のどこかでシーケンスします。それが意味があるかどうかわからない.....

しかし、これが私がこれまでに持っているものです:

#!/usr/bin/env python

import sys
import random
import math
import re

file = open(sys.argv[1], 'r')

list = []

for line in file:
    if line.startswith('G'):
        continue

    else:
        pos = re.split('\s', line)
        list.append(pos[0])
        list.append(pos[1])
        list = map(int, list)
        for i in list:
            #ldom = (i:i+1)-i + 1 
print randrange(1, 3000000000, ldom)

file.close()

'#'行は、私が問題を抱えている行です。各要素が開始位置または終了位置を表すリストがあり、list [0]は開始位置を表し、list[1]は終了位置を表します。list[0]からlist[1]を減算し、その数に1を加算する方法がわかりません。リスト内包表記は、非特定の要素またはすべてでのみ機能するようです。

4

2 に答える 2

2

これは、空白で行を分割し( str.split()のドキュメントに記載されているように、空白がデフォルトの区切り文字です)、項目を整数に変換し(を介してmap(int, ...)、次にペアに圧縮する) ipython -interpreterの例です。

In [127]: line='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16'

In [128]: zip(*[iter(map(int, line.split()))]*2)
Out[128]: [(0, 1), (2, 3), (4, 5), (6, 7), (8, 9), (10, 11), (12, 13), (14, 15)]

たとえば、いくつかの変数をboundszip式に設定してから、リストboundsを反復処理して、「特定のシーケンス」に対して実行する必要があることをすべて実行できます。例えば:

In [131]: bounds = zip(*[iter(map(int, line.split()))]*2)

In [132]: for lo, hi in bounds: print 'lo:', lo, '\thi:', hi, '\tdelta:', hi-lo+1
lo: 0   hi: 1   delta: 2
lo: 2   hi: 3   delta: 2
lo: 4   hi: 5   delta: 2
lo: 6   hi: 7   delta: 2
lo: 8   hi: 9   delta: 2
lo: 10  hi: 11  delta: 2
lo: 12  hi: 13  delta: 2
lo: 14  hi: 15  delta: 2
于 2012-12-16T17:28:57.680 に答える
0

list[0]からlist[1]を引き、その数に1を加える方法がわかりません。

それが役立つかどうかはわかりませんが、常にシンプルなものにしてください

ldom = list[0] - list[1] + 1

操作するオブジェクトが一種の数値であり、リストオブジェクトの反復を削除するfor i in list場合は、これで十分です( )

于 2012-12-16T17:20:29.757 に答える