1

我有一个包含序列的多个开始和结束位置(很多!)的文件,我想选择开始和结束位置,从开始减去结束位置以获得特定序列的长度,然后随机放置序列介于最小起始编号和最大结束编号之间。不知道这样有没有意义......

然而,这是我到目前为止所拥有的:

#!/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] 代表一个结束位置。我只是不知道如何从列表 [0] 中减去列表 [1],然后在该数字上加 1....列表推导似乎只适用于非特定元素或所有元素。

4

2 回答 2

2

这是一个 ipython 解释器示例,它在空格上分割一行(如str.split()的文档中所述,空格是默认分隔符),将项目转换为整数(通过map(int, ...),然后压缩成对:

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)]

您可以为 zip 表达式设置一些变量,例如bounds,然后在列表上迭代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

我只是不知道如何从列表 [0] 中减去列表 [1],然后在该数字上加 1....

我不知道这是否有帮助,但总是尽量保持简单兄弟

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

应该这样做,前提是您操作的对象是一种数字,并且您删除了列表对象上的迭代 ( for i in list)

于 2012-12-16T17:20:29.757 回答