我正在学习老师提供的锻炼时学习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个相同的字符串?还是我错误地解释和使用条带?
答案 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)
编辑:如果你不熟悉套装,有更多可以理解的方法, 例如(这不是非常有效):
seen
)遍历您的名称列表和每个名称
seen
,list.pop(name)
名称列表中。seen
seen.append
答案 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)