Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据一个项目的用户定义的特定顺序对行进行排序?_Python_File_Sorting - Fatal编程技术网

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

Python 如何根据一个项目的用户定义的特定顺序对行进行排序?,python,file,sorting,Python,File,Sorting,我有一个文件,里面有很多行: 原子4703 CA GLN D 328 102.64 45.75 42.46 1.00236.44 C 我想根据第4项行对它们进行排序。split[4],在这种情况下,它是d,按特定顺序排列,例如第一行带d, 然后用E表示行, 然后用一个等的线 到目前为止,我的python代码如下: for counter in range(3): if counter == 0: if line.split()[4] == 'D':

我有一个文件,里面有很多行:

原子4703 CA GLN D 328 102.64 45.75 42.46 1.00236.44 C

我想根据第4项行对它们进行排序。split[4],在这种情况下,它是d,按特定顺序排列,例如第一行带d, 然后用E表示行, 然后用一个等的线

到目前为止,我的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)`
def key(line):
    splitted = line.split()
    return ordering.index(splitted[4])

lines.sort(key=key)

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

我认为问题在于,要按照您想要的方式解决这个问题,您应该运行三次循环:在第一次迭代中打印值为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

要对行进行排序,为什么不使用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表达式看起来很复杂,则可以对键使用完整的函数定义,如下所示:

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)`
def key(line):
    splitted = line.split()
    return ordering.index(splitted[4])

lines.sort(key=key)

请记住,在python中,缩进很重要,最后两个if语句应该与第一个if语句对齐。尝试修复缩进。在我的脚本中,它们是对齐的:显示外部循环,在其中循环所有行。我认为问题在于,要按照您所希望的方式解决这个问题,您应该运行三次循环:在第一次迭代中打印值为“D”的行,在第二次迭代中打印值为“A”的行,依此类推。我发现了问题所在。要循环遍历每一行,我必须重新打开输入文件。你知道有什么诀窍吗,伦登?还是每次我想循环所有行时都必须打开和关闭文件?当然!它起作用了!非常感谢。所以,不是每次打开和关闭文件,我应该用读线读取文件。非常感谢你。