如何根据一个项目的用户定义的特定顺序对行进行排序?

时间:2014-09-19 18:08:47

标签: python file sorting

我有一个包含这些行的文件:

  

ATOM 4703 CA GLN D 328 102.64 45.75 42.46 1.00236.44 C

我希望按照特定顺序对第4项(line.split()[4],对于本案例为D)进行排序,例如带D的第一行,               然后用E线, 然后用A等线。

到目前为止,我的python代码如下:

for counter in range(3):
   if counter == 0:
        if line.split()[4] == 'D':    
                outputFile.write(line)
   if counter == 1:
        if line.split()[4] == 'E':   
                outputFile.write(line)
   if counter == 2:
        if line.split()[4] == 'A':     
                outputFile.write(line)`

但是,它只获得包含D的行。有什么帮助吗?

2 个答案:

答案 0 :(得分:0)

我认为问题在于,要以你想要的方式解决这个问题,你应该运行三次循环:在第一次迭代中打印那些值为D的行,在第二次迭代中打印那些A等等。您的代码应如下所示:

# Store the lines in an array, this way you don't to reopen the file.
f = open('filename')
lines = f.readlines()

for line in lines:
    if line.split()[4] == 'D':
        print line

for line in lines:
    if line.split()[4] == 'E':
        print line

for line in lines:
    if line.split()[4] == 'A':
        print line

答案 1 :(得分:0)

您想对行进行排序,那么为什么不将list.sort与键功能一起使用?

with open('text.txt') as f:
    lines = f.read().splitlines()

ordering = ['D', 'E', 'A']

lines.sort(key=lambda x: ordering.index(x.split()[4]))

for line in lines:
    print(line)

虽然不推荐,但如果lambda表达式似乎很复杂,您可以使用key的完整函数定义,如下所示:

def key(line):
    splitted = line.split()
    return ordering.index(splitted[4])

lines.sort(key=key)