我有一个包含文本行的现有文本文件,并且已经按字母顺序排序。如何在Python中以编程方式检测到文件已排序。
示例我有一个名为input.txt的文件,其内容如下:
"A story book is on table
By the river, there is a duck
Meanwhile, let's cooking"
我可以使用什么Python方法来检查已按字母顺序排序的行?
答案 0 :(得分:0)
with open('input.txt', 'r') as r:
for line in sorted(r):
print(line, end='')
这将对您的代码进行排序!!问题是它需要更多的内存
答案 1 :(得分:0)
如果您的目标只是告诉行是否按顺序排序,则可以简单地遍历行并一次比较2个。如果一切按字母顺序顺利进行到结尾,即line 2 < line 3
,line 3 < line 4
,etc.
,则文件将被排序,否则,文件将不被排序。
这是一个快速的实现。
def is_file_sorted(file_name):
with open(file_name, 'r') as file:
# This is the first line
previous_line = next(file)
for line in file:
# Cool, sorted, so far so good
# Keep going
if previous_line <= line:
previous_line = line
# This line is out of order
# The file is not sorted
else:
return False
# All the lines are in sorted order
return True
答案 2 :(得分:0)
# Pass in lines from the file
def are_lines_sorted(lines):
# remove spaces
lines = [l.strip() for l in lines]
# do not include empty lines
lines = [l for l in lines if len(l) > 0]
# convert all lines to lowercase
lines = [l.lower() for l in lines]
return all(l1 <= l2 for l1, l2 in zip(lines, lines[1:]))
对于最后一行:
1。 zip(lines, lines[1:])
这会创建(不是真的)成对的连续行列表。像这样:
[
(line_1, line_2),
(line_2, line_3),
# ...
(line_n-1, line_n),
]
有关更多信息,请参见this。
2。 for l1, l2 in zip(lines, lines[1:])
遍历#1中的每一对,并将它们分配给l1
和l2
。这称为unpacking。
3。 l1 <= l2 for l1, l2 in zip(lines, lines[1:])
然后对于每个配对,确定l1
是否盲法小于l2
。基本上,这将为每对创建一个布尔值列表。
4。 all(l1 <= l2 for l1, l2 in zip(lines, lines[1:]))
True
时,all()才返回true。 (即文件已排序)
答案 3 :(得分:0)
如果您想知道这些行是否在文件中排序,请将这些行迭代地存储到列表中。现在,将列表与其排序形式(a == sorted(a))进行比较,以了解文件是否已排序。
##%time
with open('iris.csv', 'r') as iris:
a=[]
for line in iris:
a.append(line)
if a==sorted(a):
print('file is already sorted')
else:
print('file is not sorted')