无法使用python对列表进行排序

时间:2012-09-16 04:47:04

标签: python sorting

我对python有些新意。我正在尝试排序字符串和整数列表。列表包含一些需要过滤掉的符号(即ro!ad应该结束)。而且,它们都在由空格分隔的一条线上。所以我需要使用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行变量。我在这种情况下使用print来加速编辑,但需要将其写入文件。这就是输出文件区域被注释的原因,但是如果我把它搞砸了,请随时告诉我我是傻瓜!谢谢你的帮助!

3 个答案:

答案 0 :(得分:1)

因为他们在同一条线上,所以你真的不需要阅读线

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(

答案 1 :(得分:1)

当您遇到这样的问题时,通常最好在整个程序的各个点检查数据,以确保它看起来像您想要的那样。这里的问题似乎与你在文件中阅读的方式有关。

data = ifile.readlines()

将在整个文件中读取行列表。但由于您要排序的所有条目都在一行上,因此该列表只有一个条目。当您尝试对列表进行排序时,您将传递长度为1的列表,无论您的键功能是什么,它都将返回相同的列表。尝试将行更改为

data = ifile.readlines()[0].split()

您可能不再需要键功能,因为默认情况下将数字放在字母之前。我没有在你的代码中看到删除特殊字符的任何内容。

答案 2 :(得分:0)

  

此外,它们都在一行中以空格分隔。

所以你的文件包含一行?

  

data = ifile.readlines()

这会使data成为文件中的行列表。所有这些都是。

  

r =已排序(...)

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

要从行中获取单词,您可以.read()将整个文件作为单个字符串,.split()它(默认情况下,它会在空格上分割)。