Python通过列表进行过滤和排序

Python通过列表进行过滤和排序,python,if-statement,for-loop,split,Python,If Statement,For Loop,Split,我就是没办法让这件事发生。我需要打开文件ranger.txt。 读每一行,然后把每一行分成一个单词列表。检查列表中是否已包含每个单词。如果单词不在列表中,则将其添加到列表中。在程序结束时,按字母顺序排序并打印生成的单词 结果应该是: [“a”,“和”,“扣”,“C130”,“计数罗林”,“门”,“下”,“四”,“去”,“跳”,“小”,“出去”,“游侠”,“侦察”,“右”,“洗牌”,“站着”,“到”,“拿”,“绊倒”,“向上”] 我可以打印单个列表,甚至每个列表中有一个单词,但仅此而已 range

我就是没办法让这件事发生。我需要打开文件ranger.txt。 读每一行,然后把每一行分成一个单词列表。检查列表中是否已包含每个单词。如果单词不在列表中,则将其添加到列表中。在程序结束时,按字母顺序排序并打印生成的单词

结果应该是: [“a”,“和”,“扣”,“C130”,“计数罗林”,“门”,“下”,“四”,“去”,“跳”,“小”,“出去”,“游侠”,“侦察”,“右”,“洗牌”,“站着”,“到”,“拿”,“绊倒”,“向上”]

我可以打印单个列表,甚至每个列表中有一个单词,但仅此而已

rangerHandle = open("ranger.txt")
count = 0
rangerList = list()

for line in rangerHandle:
    line = line.rstrip()
    #print line works at this point
    words = line.split() # split breaks string makes another list
    #print words works at this point
    if words[count] not in words: 
        rangerList.append(words[count])        
        count += 1
    print rangerList
ranger.txt文件是:

C130 rollin down the strip
Recon ranger
Gonna take a little trip
Stand up, buckle up,
Shuffle to the door
Jump right out and count to four

如果你打算投反对票,请至少给出一个解释。

我们可以创建列表,而不必找到重复项。我们稍后将通过将列表转换为集合来删除它们。然后,我们通过执行不区分大小写的排序对集合进行排序:

with open("ranger.txt") as f:
    l = [w for line in f for w in line.strip().split()]
print(sorted(set(l), key=lambda s: s.lower()))
结果:

[
    'a', 'and', 'buckle', 'C130', 'count', 'door', 'down', 'four', 
    'Gonna', 'Jump', 'little', 'out', 'ranger', 'Recon', 'right', 
    'rollin', 'Shuffle', 'Stand', 'strip', 'take', 'the', 'to', 'trip',
    'up,'
]

我们可以创建列表而不必找到重复项。我们稍后将通过将列表转换为集合来删除它们。然后,我们通过执行不区分大小写的排序对集合进行排序:

with open("ranger.txt") as f:
    l = [w for line in f for w in line.strip().split()]
print(sorted(set(l), key=lambda s: s.lower()))
结果:

[
    'a', 'and', 'buckle', 'C130', 'count', 'door', 'down', 'four', 
    'Gonna', 'Jump', 'little', 'out', 'ranger', 'Recon', 'right', 
    'rollin', 'Shuffle', 'Stand', 'strip', 'take', 'the', 'to', 'trip',
    'up,'
]

首先,在处理文件()时,最好使用
with…
语法

第二,如果我是你,我会使用集合()而不是列表。它们的优点是不能两次添加同一个元素,因此不需要检查单词是否已在集合中。对于每一行,我将使用该行上的单词创建一个新集合,并使用
union
方法将其与其他单词合并

words = set([])
with open("ranger.txt") as f:
     for line in f:
         newset = set(line.rstrip().split())
         words = words.union(newset)
words = sorted(words) ## this line transforms the set into a sorted list

首先,在处理文件()时,最好使用
with…
语法

第二,如果我是你,我会使用集合()而不是列表。它们的优点是不能两次添加同一个元素,因此不需要检查单词是否已在集合中。对于每一行,我将使用该行上的单词创建一个新集合,并使用
union
方法将其与其他单词合并

words = set([])
with open("ranger.txt") as f:
     for line in f:
         newset = set(line.rstrip().split())
         words = words.union(newset)
words = sorted(words) ## this line transforms the set into a sorted list

您指定仅当单词不在列表中时才应将其添加到列表中,但您想要的结果包含重复的元素。嗯……我手动添加了,所以这是一个错误。但是谢谢,我更正了。您指定只有在单词不在列表中时才应将其添加到列表中,但是您想要的结果有重复的元素。嗯……我手动执行了,所以这是一个错误。但是谢谢,我更正了。谢谢Julien,我正在尝试该文件,但它似乎不起作用。从ranger.txt文件?C130滚开,侦察游侠,要走一小段路,站起来,系好安全带,走到门口,跳出来,数到四,-每行以逗号结尾,请参阅原始帖子了解实际行数。谢谢Julien,我正在尝试该文件,但似乎不起作用。从ranger.txt文件?C130沿长条滚下,侦察护林员,要走一小段路,站起来,系好安全带,走到门口,跳到右边,数到四,--每一行以逗号结尾,实际行请参见原始帖子。@JUnitorCompressor将它们添加到列表中时,您可能希望将它们转换为小写。否则,可以在大写和小写之间使用重复项。我对我的答案也有同样的问题,但你的答案比我的答案更容易解决。是的,OP可以做到,但我不太清楚他是否需要。转换为小写不是问题的一部分。@JUnitorCompressor在将它们添加到列表中时,您可能希望将它们转换为小写。否则,可以在大写和小写之间使用重复项。我对我的答案也有同样的问题,但你的答案比我的答案更容易解决。是的,OP可以做到这一点,但我不太清楚他是否需要。转换成小写不是问题的一部分。