从列表中删除重复项并使用python对其进行排序

时间:2017-09-02 21:54:59

标签: python list sorting

我正在学习老师提供的锻炼时学习python和鼓励者的问题。所以我有一个txt文件包含一个名单,如下所示

Noah

Liam

Madison

Jayden

Elizabeth

Jacob

Mia

Noah

Angelia

Bob

Cindy

我应该从列表中删除重复项,例如列表中有2个'Noah',我应该删除其中一个并返回按字母顺序排序的列表,例如

Angelia

Bob

Cindy

...

我已经在互联网上搜索了解我们应用set的方法。 但是我的老师在评论中指出并说

 for n in open('class_list.txt'):
# TODO: do something with n.strip() "

我不明白为什么在这里使用条带功能?如果我写n.strip('Noah')只是简单地从列表中删除2个相同的字符串?还是我错误地解释和使用条带?

4 个答案:

答案 0 :(得分:1)

是的,您错误地解释了str.strip()。它的作用是删除行开头和结尾处的所有空白区域。你想做的就是这样的事情

names = []
with open(filename, 'r') as f:
    for line in f:
        if line not in names:
            names.append(line.strip())
for name in names.sort():
    print name

这样做会打开一个带有名字的文件。然后迭代每一行,每一行都是一个名称。您检查是否已经看到该名称,如果没有,则将其添加到names。最后对唯一名称进行排序并打印出来。

答案 1 :(得分:1)

将名称添加到set并对其进行排序。

names = set()
with open('class_list.txt') as f:
    for line in f:
        if line.strip():
            names.add(line.strip())

print('\n'.join(sorted(names)))
  • 在插入过程中处理重复项
  • 无需额外in次比较

使用str.strip是为了在从文件中读入行时消除尾随换行符。

答案 2 :(得分:1)

我怀疑你的老师打算用strip()来消除重复,但要删除名字后面的空格。 由于这看起来像是一个家庭作业问题,我不会给你解决方案,但我会试着指出你正确的方向。

您应该知道如何使用file = open("file")with open("file") as f来读取数据。因此,通过列表名称,我们可以解决重复问题。但是,单词可能在每个单词的末尾包含一些讨厌的字符(\n,特别是换行符)。为了解决这个问题,请调用word.strip(),它会在最后销毁不必要的字符和空格。因此,当您到达单词列表时,请执行类似

的操作
for i in names:
    i = i.strip()

您知道如上所述使用集合,但是,集合是无序数据类型,因此当您将列表转换为集合(使用set(list)list(set)),然后设置回来到列表,订单丢失。但是,它可以通过方便的python函数sorted(list)轻松恢复,它将按字母顺序为您排序名称。

然后打印列表是微不足道的,其中包含了

的效果
for i in names: #names is your list 
    print(i)

编辑:如果你不熟悉套装,有更多可以理解的方法, 例如(这不是非常有效):

  1. 为您已经看过的商店名称(seen
  2. 保留一个空名称列表
  3. 遍历您的名称列表和每个名称

    1. 如果名称位于seenlist.pop(name)名称列表中。
    2. 如果不是,请使用seen
    3. 将其添加到seen.append
  4. 打印清单!

答案 3 :(得分:0)

删除重复项的最佳方法是使用set。这是一个没有重复的元素集合。

例如,您可以存储如下名称:

names = set([])
with open(filename, 'r') as f:
    for line in f:
        names.add(line.strip())  # drop the trailing \n

然后,对列表进行排序:

names = sorted(names)

Python语言具有comprehension list(和设置)的概念。

因此,您可以像这样简化代码:

with open(filename, 'r') as f:
    names = set(line.strip() for line in f)
names = sorted(names)

如果您的姓名不仅是英文名称且包含非ASCII字符,您可能需要与locale排序。一种解决方案如下:

import locale

# this reads the environment and inits the right locale
locale.setlocale(locale.LC_ALL, "")

names = sorted(names, key=locale.strxfrm)