下面我开始创建一个脚本,用于获取.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
答案 0 :(得分:1)
每当你写range(0, len(some_sequence))
时,你都会做错事。不要这样做。使用迭代器。 Python字符串对象已经有了测试isupper
,isalpha
,isnumber
等的方法。所以只需写:
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])