繁体   English   中英

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

[英]Removing duplicates from a list and sorting it using python

我目前正在学习由老师提供的锻炼时的python和鼓励者问题。 所以我有一个txt文件,其中包含如下名称列表

Noah

Liam

Madison

Jayden

Elizabeth

Jacob

Mia

Noah

Angelia

Bob

Cindy

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

Angelia

Bob

Cindy

....

我已经在互联网上搜索过,并且知道我们套用方法。 但是我的老师在评论中指出

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

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

是的,您错误解释了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 最后,对唯一名称进行排序并打印。

将名称添加到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 ,使用str.strip可以消除结尾的换行符。

我怀疑您的老师是要使用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名称( seen
  2. 遍历您的姓名列表,并为每个姓名重复

    1. 如果名称中seenlist.pop(name)从名称列表吧。
    2. 如果不是,将它添加到seenseen.append
  3. 打印列表!

删除重复项的最佳方法是使用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语言具有理解列表 (和集合)的概念。

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

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM