对导入的列表进行排序不起作用

时间:2017-04-14 19:10:37

标签: python sorting

我正在尝试对导入的列表进行排序,然后显示它,但我尝试了各种各样的事情,但它没有用。

以下是列表的例子:

pommes : 54
bananes : 18
oranges : 30


ananas :12
clémentines    :77
cerises de terre:    43

输出应按字母顺序排列

这就是我得到的

['\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0', '1', '1', '2',
 '3', '3', '4', '4', '5', '7', '7', '8', ':', ':', ':', ':', ':', ':', 'a', 'a', 'a', 'a', 'a', 'a', 'b', 'c', 'c', 'd', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e'
, 'e', 'e', 'g', 'i', 'i', 'l', 'm', 'm', 'm', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'o', 'o', 'p', 'r', 'r', 'r', 'r', 's', 's', 's', 's', 's', 's', 's', 't', 't
', 'é']

这是我的代码

import sys

def liste(entree):
    try:
        ouvrir = open("data2.txt")
    except IOError:
        message1 = "Le fichier data2 n'existe pas."
        return message1
    lecture = ouvrir.read()
    if len(entree) < 1:
        message2 = "Il faut préciser le nom du fichier à traiter"
        return message2
    elif len(entree) > 1:
        message3 = "Un seul argument est attendu, soit le nom du fichier à traiter."
        return message3
    else:
        return lecture

def main():
    while True:
        entree = sys.argv[1:]
        choix = str(entree)
        texte = "data2.txt"
        if texte in choix:
            message4 = liste(entree)
            message4 = sorted(message4)
            print(message4)
            break
        else:
            print("Il faut préciser le nom du fichier à traiter")
            exit()

if __name__ == "__main__":
    main()

3 个答案:

答案 0 :(得分:2)

你需要在这里使用readlines方法,它将行读入列表,而不是read方法,它将所有内容都返回到字符串中。

lecture = ouvrir.readlines()

最终节目:

import sys

def liste(entree):
    try:
        ouvrir = open("data2.txt")
    except IOError:
        message1 = "Le fichier data2 n'existe pas."
        return message1
    lecture = ouvrir.readlines()
    if len(entree) < 1:
        message2 = "Il faut préciser le nom du fichier à traiter"
        return message2
    elif len(entree) > 1:
        message3 = "Un seul argument est attendu, soit le nom du fichier à traiter."
        return message3
    else:
        return lecture

def main():
    while True:
        entree = sys.argv[1:]
        choix = str(entree)
        texte = "data2.txt"
        if texte in choix:
            message4 = liste(entree)
            print(message4)
            message4 = sorted(message4)
            print(message4)
            break
        else:
            print("Il faut préciser le nom du fichier à traiter")
            exit()

if __name__ == "__main__":
    main()

运行:

$ python3 french-program.py data2.txt                                                                         
['Orange\n', 'Apple\n', 'Banada']
['Apple\n', 'Banada', 'Orange\n']

答案 1 :(得分:1)

尝试使用readlines,(请参阅此回答:How do I read a file line-by-line into a list?,另请参阅:Reading a text file and splitting it into single words in python)。

哦,并且打开()&#39;是惯用的(比尝试更多),

with open("data2.txt") as ouvrir:
    lines = ouvrir.readlines()
print sorted(lines)

假设每行包含一个单词,您就完成了。

假设您希望将每一行视为单词(每行一个或多个单词),对每行的单词进行排序,并对行进行排序,

#open file "data2.txt" and readlines into list
#split each line into words and sort that list of sorted lines
#words = list ( list ( word ) )
with open("data2.txt") as ouvrir:
    lines = ouvrir.readlines()
    line_words = [ x for x in [ line.split(":") for line in lines ] ]
    #line_names = [ x[0] for x in [ line.split(":") for line in lines ] ]
print sorted(line_words)

假设每一行都有一个或多个单词,并且您想要一个排序的单词列表?以下内容将嵌套的单词列表展平为单个单词列表

#open file "data2.txt" and readlines into list
#split each line into words, flatten into single list of words
#words = list ( word )
with open("data2.txt") as ouvrir:
    lecture = ouvrir.readlines()
    words = [ word for line in lecture for word in line.split() ]
print sorted(words)

假设您的行具有键:值对,例如&#34; Apple:23&#34;?,然后你想要一些不同的东西

您的程序将检查主菜(切片sys.argv [1:])与打开和读取文件相结合。你应该分开这两个功能。这是修改代码的一种方法,

import sys

def liste(texte,entree):
    if len(entree) < 1:
        return "Il faut préciser le nom du fichier à traiter"
    elif len(entree) > 1:
        return "Un seul argument est attendu, soit le nom du fichier à traiter."
    with open(texte) as ouvrir:
        lecture = ouvrir.readlines()
        words = [ x.split(":")[0].strip() for x in [ line.strip() for line in lecture ] ]
        words = [ x for x in words if len(x) > 1 ] #filter, remove short words (blanks)
        return lecture
    return "Le fichier {} n'existe pas.".format(texte)

def main():
    while True:
        entree = sys.argv[1:]
        choix = str(entree)
        texte = "data2.txt"
        if texte in choix:
            message4 = sorted(liste(texte,entree))
            print(message4)
            for el in message4: print(el)
            break
        else:
            print("Il faut préciser le nom du fichier à traiter")
            break

if __name__ == "__main__":
    main()
    exit()

答案 2 :(得分:1)

您的陈述

ouvrir = open("data2.txt")
lecture = ouvrir.read()

的工作方式如下:open("data2.txt")返回您的文件对象 标签名为ouvrir,方法.read()返回一个字符串 与"data2.txt"的内容一致,并标明此内容 字符串为lecture

当您引用lecture时,您引用字符串而不是列表...

解决问题的一种聪明方法是使用字符串方法: splitlines();它接受一个字符串并返回一个元素列表 是通过在换行符之间拆分原始字符串而获得的字符串。

lecture = ouvrir.read()        # lecture is a string
lecture = lecture.splitlines() # lecture is now a list of strings (lines)

这就是你需要继续前进的。请注意,作为 原始内容在换行符上分割,没有换行符(即&#39; \ n&#39; 字符)在你要排序的行中不再存在......

要完成我的回答,我必须提到方法可以链接

lecture = ouvrir.read().splitlines()

附录

另一种可能性是单独留下您的liste()功能(请注意 liste是一个误导性的名称,因为你的函数返回一个字符串,而不是一个字符串 list ...)并对liste返回的字符串进行后处理 - 或者我 更确切地说,其他可能性,即使&#34;应该有一个 - 和 最好只有一种 - 明显的方式来做到这一点&#34; ...

(...)
       if texte in choix:
            message4 = liste(entree)          ## m4 is a string of characters
            message4 = message4.splitlines()  ## m4 is a list of strings,
                                              ##    one string <-> one line in file
            message4 = sorted(message4)       ## m4 contents are sorted now

            for line in message4:             ## let's do something for each line in m4
                if line:                      ## that is, if the line contains something
                    print(line)
            print('############################# alternative')
            lines = sorted(l for l in liste(entree).splitlines() if l)
            for line in lines: print(line)
            print('############################# alternative')
            for line in sorted(l for l in liste(entree).splitlines() if l): print(line)
            print('############################# alternative')
            print('\n'.join(sorted(l for l in liste(entree).splitlines() if l)))
            break
        else:
(...)