在python中创建几个匹配多个范围的列表

时间:2016-10-14 17:08:58

标签: python

我的代码存在问题,我花了很长时间才解决它,我无法修复它:

我有一个这样的文件:

Sub saver()
Dim fn As String
Dim l As Long
Dim wb As Workbook

Set wb = ActiveWorkbook
fn = wb.FullName
l = InStrRev(fn, ".")
fn = Left(fn, l)
fn = fn & "txt"

wb.SaveAs Filename:=fn, FileFormat:=xlText
wb.Close

End Sub

我想要做的是使用第八列上的值对行进行分组,然后提取第六列的相应值并找到它们的最大值和最小值。

像这样:

ATOM   1375  N   PHE F 411      81.522  91.212  98.734  1.00  0.00           N  
ATOM   1376  H   PHE F 411      82.393  91.667  97.546  1.00  0.00           H  
ATOM   1377  CA  PHE F 411      80.451  91.974  95.377  1.00  0.00           C  
ATOM   1378  CB  PHE F 411      80.968  93.339 100.842  1.00  0.00           C  
ATOM   1379  CG  PHE F 411      81.813  93.277 102.083  1.00  0.00           C   
ATOM   1381  HD1 PHE F 411      83.566  92.729 105.124  1.00  0.00           H  

我想要的输出是:

Group 1  8th column values from 95 to 100

ATOM 1375 N PHE F 411 81.522 91.212 98.734 1.00 0.00 N 

ATOM 1376 H PHE F 411 82.393 91.667 97.546 1.00 0.00 H

ATOM 1377 CA PHE F 411 80.451 91.974 95.377 1.00 0.00 C 

第二组 - 从100到105

Min-80.451

Max-82.393

依旧等等

这是我在python中的代码:

Mix - 80.968

Max - 83.566

我得到的输出是所有值的最小值和最大值,如

def get_x(file):
    x=[]
    for line in file:
       new_line=line.split()
       for z in range(80, 140, 2):
          if ( float(new_line[8]) >z and float(new_line[8])<z+2):
             x.append(float(new_line[6]))
          else:
             pass
    maxx=max(x)
    minx=min(x)
    print maxx, minx

感谢任何帮助:)

提前致谢

1 个答案:

答案 0 :(得分:0)

以下是我放在一起的代码,可以满足您的需求。我会看一下mapfilter的python文档,这对于做这样的事情非常方便。

text = """ATOM   1375  N   PHE F 411      81.522  91.212  98.734  1.00  0.00           N
ATOM   1376  H   PHE F 411      82.393  91.667  97.546  1.00  0.00           H
ATOM   1377  CA  PHE F 411      80.451  91.974  95.377  1.00  0.00           C
ATOM   1378  CB  PHE F 411      80.968  93.339 100.842  1.00  0.00           C
ATOM   1379  CG  PHE F 411      81.813  93.277 102.083  1.00  0.00           C
ATOM   1381  HD1 PHE F 411      83.566  92.729 105.124  1.00  0.00           H """
lines = text.split('\n')

data = [line.split() for line in lines]

groups = [
    (95, 100),
    (100, 105),
]

for i in range(len(groups)):
    gMin, gMax = groups[i]
    results = filter(lambda x: gMin <= float(x[8]) < gMax, data)
    results = map(lambda x: float(x[6]), results)

    print "Group", i+1, "8th column values from", gMin, "to", gMax
    print "Min -", min(results)
    print "Max -", max(results)
    print ""

这是输出:

Group 1 8th column values from 95 to 100
Min - 80.451
Max - 82.393

Group 2 8th column values from 100 to 105
Min - 80.968
Max - 81.813

此代码效率低下,因为它不会删除以前组的结果。如果你需要增加的效率让我知道。