如何检测Python中已按字母顺序排序的文本文件内容

时间:2019-09-29 05:06:03

标签: python

我有一个包含文本行的现有文本文件,并且已经按字母顺序排序。如何在Python中以编程方式检测到文件已排序。

示例我有一个名为input.txt的文件,其内容如下:

"A story book is on table

 By the river, there is a duck

 Meanwhile, let's cooking"

我可以使用什么Python方法来检查已按字母顺序排序的行?

4 个答案:

答案 0 :(得分:0)

with open('input.txt', 'r') as r:
    for line in sorted(r):
        print(line, end='')

这将对您的代码进行排序!!问题是它需要更多的内存

答案 1 :(得分:0)

如果您的目标只是告诉行是否按顺序排序,则可以简单地遍历行并一次比较2个。如果一切按字母顺序顺利进行到结尾,即line 2 < line 3line 3 < line 4etc.,则文件将被排序,否则,文件将不被排序。

这是一个快速的实现。

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中的每一对,并将它们分配给l1l2。这称为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:]))

当且仅当#3中的所有布尔值是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')