使用python排序列表时出现问题

使用python排序列表时出现问题,python,sorting,Python,Sorting,我对python有些陌生。我正在尝试对字符串和整数列表进行排序。列表中包含一些需要过滤掉的符号(即ro!广告应该以道路结尾)。而且,它们都在一条线上,由一个空格分隔。所以我需要使用2个参数;一个用于输入文件,然后是输出文件。它应该先用数字排序,然后用不带特殊字符的单词在不同的行上排序。我一直在查看大量的列表函数,但在组合这些函数时遇到了一些困难,因为我从来没有做过类似的事情。有人要吗 到目前为止,我有基本的东西 #!/usr/bin/python import sys try: infi

我对python有些陌生。我正在尝试对字符串和整数列表进行排序。列表中包含一些需要过滤掉的符号(即ro!广告应该以道路结尾)。而且,它们都在一条线上,由一个空格分隔。所以我需要使用2个参数;一个用于输入文件,然后是输出文件。它应该先用数字排序,然后用不带特殊字符的单词在不同的行上排序。我一直在查看大量的列表函数,但在组合这些函数时遇到了一些困难,因为我从来没有做过类似的事情。有人要吗

到目前为止,我有基本的东西

#!/usr/bin/python

import sys

try:
  infilename = sys.argv[1] #outfilename = sys.argv[2]
except:
  print "Usage: ",sys.argv[0], "infile outfile"; sys.exit(1)

ifile = open(infilename, 'r')
#ofile = open(outfilename, 'w')
data = ifile.readlines()
r = sorted(data, key=lambda item: (int(item.partition(' ')[0])
                               if item[0].isdigit() else float('inf'), item))
ifile.close()
print '\n'.join(r)
#ofile.writelines(r)
#ofile.close()

输出完全显示文件中的内容,但与写入的文件完全相同,并且根本没有排序。目标是获取一个文件(arg1.txt)并对其进行排序,然后生成一个新文件(arg2.txt),该文件将是cmd行变量。在本例中,我使用“打印”来加快编辑速度,但需要将其写入文件。这就是为什么输出文件区域会被注释,但是如果我也搞砸了,请随意告诉我我很愚蠢!谢谢你的帮助

既然它们在同一行上,你就不需要读行了

with open('some.txt') as f:
    data = f.read()  #now data = "item 1 item2 etc..."
您可以使用re过滤掉不需要的字符

import re
data = "ro!ad"
fixed_data = re.sub("[!?@$]","",data)
分区可能有点过头了

data = "hello 23frank sam wilbur"
my_list = data.split() # ["hello","23frank","sam","wilbur"]
print sorted(my_list)
然而,您需要做更多的工作来强制数字排序,比如

numbers = [x for x in my_list if x[0].isdigit()]
strings = [x for x in my_list if not x[0].isdigit()]
sorted_list = sorted(numbers,key=lambda x:int(re.sub("[^0-9]","",x))) + sorted(strings(

当您遇到这样的问题时,通常最好在整个程序的各个点检查您的数据,以确保其外观符合您的要求。这里的问题似乎是你在文件中阅读的方式

data = ifile.readlines()
将以行列表的形式读入整个文件。但是,由于要排序的所有条目都在一行上,因此此列表将只有一个条目。当您尝试对列表进行排序时,您传递的是一个长度为1的列表,无论您的键函数是什么,它都将返回相同的列表。试着把线路改成

data = ifile.readlines()[0].split()
您甚至可能不再需要键功能,因为默认情况下数字放在字母之前。但是,我在代码中没有看到任何删除特殊字符的内容

而且,它们都在一条线上,由一个空格分隔

那么您的文件只包含一行

data=ifile.readlines()

这使得
数据
成为文件中的行列表。全部1个

r=已排序(…)

这使得
r
成为该列表的排序版本


要从行中获取单词,您可以
.read()
将整个文件作为单个字符串,然后
.split()
将其拆分(默认情况下,它在空白处拆分)。

您的代码很难读取。也许您应该将lambda从
参数中分离出来,以
排序()
,因此它是单独的函数(以清晰的方式编写)。您正在以不清楚的方式对
数据
进行排序:您获取
项.partition
,但也访问其元素
项[0]
。您的意思是
项.partition()[0].isdigit()
?但是在这种情况下,单独的功能会更好。谢谢你的反馈。正如我所说的,我对Python非常陌生。我试着把lambda和钥匙分开一点,结果被拒绝了。当我使用data=set(['apple'、'zebra'、'carousel'])并尝试使用它而不是使用文件作为输入时,排序后的代码工作得非常好。我只是无法让它与文件一起工作,而不是将我放入脚本本身的内容。您使用什么文件作为输入?这是我工作中的文件。我们的一个程序吐出了一个…无组织的文件。太棒了!第二行正是让算法正确排序所需要的。现在我必须弄清楚特殊角色的问题。谢谢它可能不会正确地排序数字(例如:“100”“200”“23”“3”“45”“5”),到目前为止,它完成了我需要它做的所有事情,除了去掉特殊字符。我正在试着换潜水艇,但总是出错。我可能做错了什么。有没有人能找到一个有趣的解决方案,这样我就不用带猎枪去我的电脑了?lolre.sub应该注意你要做的事情,但是一些特殊字符在正则表达式中有特殊的含义,所以你可能不得不避开它们。谢谢你的回答!我特别喜欢特殊角色部分。我只是想知道如何使用它将它们从使用过的文件中删除。有点像写入另一个文件之前的最终过滤器。在排序之前应该删除特殊项,除非您特别希望它们影响排序顺序。