想要使用随机字符和数字对文件进行排序,而不使用python中的sort函数

时间:2016-02-19 04:35:45

标签: python list file sorting

下面我开始创建一个脚本,用于获取.txt文件并按大写,小写,特殊字符和数字对其进行排序。我觉得我错过了很简单的事情。任何建议将我推向正确的方向将不胜感激。我使用的是Python 3.5.1

#!usr/bin/python

ifname = raw_input('Enter the input file name: ')

try:
    fhand = open(ifname).read()
    print fhand

except:
    print 'File cannot be opened:', ifname


Upper = []
Lower = []
Number = []
Special = []

for x in range(len(fhand))
    if fhand[x] <= 'Z' and fhand[x] >= 'A':
        Upper = fhand[x]

print Upper

返回一个值而不是列表

编辑脚本以反映建议:

 for x in fhand
    if x <= 'Z' and x >= 'A':
        Upper.append = (fhand[x])

print Upper

结果如下:

$ python file_sorting.py
Enter the input file name: Unknow.txt
 ds dfa
 877
 444, 50, 33
 #$, %%,
 7 7 7 8 5 2 3
S
DD SD
W
A 
A
T
bb
dfg

Traceback (most recent call last):
 File "file_sorting.py", line 21 in <module>
  Upper.append(fhand[x])
TypeError: string indices must be integers, not str

2 个答案:

答案 0 :(得分:1)

每当你写range(0, len(some_sequence))时,你都会做错事。不要这样做。使用迭代器。 Python字符串对象已经有了测试isupperisalphaisnumber等的方法。所以只需写:

for x in fhand:
    if x.isupper():
        Upper.append(x)
    ...

其次,我不确定你为什么要避免使用python的sort()。如果您使用key关键字参数,则可以指定应该如何进行比较,这样可以快速将序列排序为组。

最后结束使用itertools.groupby对其进行分组,然后你就完成了。

from itertools import groupby

fhand = open('/etc/passwd', 'r').read()
sorter = lambda x: x.isupper() and 'upper' or x.isdigit() and 'digit' or \
    x.isalnum() and 'alpha' or 'special'

for g, li in groupby(sorted(fhand, key=sorter), sorter):
    print g, list(li)
编辑:回想亚马逊的求职面试,可能有理由避免排序,他们喜欢提出这样的问题:如果档案是巨大的,该怎么办?那么,然后对它进行排序需要O(n * log(n)),并且只需迭代它就是O(n)。但是如果文件很大,你不应该用字符构建列表: - )

答案 1 :(得分:0)

您没有添加到列表中。你需要更换它:

Upper = fhand[x]

Upper.append(fhand[x])

此外,您可以使用:

for char in fhand:
    if char <= 'Z' and char >= 'A':
        Upper.append(fhand[x])