1

我对python有点陌生。我正在尝试对字符串和整数列表进行排序。列表包含一些需要过滤掉的符号(即 ro!ad 应该以 road 结尾)。而且,它们都在一行上,由空格隔开。所以我需要使用 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 来加快编辑速度,但需要将其写入文件。这就是为什么输出文件区域被评论的原因,但如果我把它搞砸了,请随时告诉我我很愚蠢!谢谢你的帮助!

4

3 回答 3

1

因为它们在同一行,所以你真的不需要 readlines

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(
于 2012-09-16T05:52:55.007 回答
1

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

data = ifile.readlines()

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

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

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

于 2012-09-16T05:53:32.517 回答
0

而且,它们都在一行上,由空格隔开。

所以你的文件包含一行?

数据 = ifile.readlines()

这将data成为文件中行的列表。所有1个。

r = 排序(...)

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

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

于 2012-09-16T05:54:45.417 回答