我对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来加速编辑,但需要将其写入文件。这就是输出文件区域被注释的原因,但是如果我把它搞砸了,请随时告诉我我是傻瓜!谢谢你的帮助!
答案 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()
它(默认情况下,它会在空格上分割)。