在Python 3中删除列表中部分重复的条目的特定实例

问题描述

我对Python比较陌生。但是,我的需求通常只涉及对严格格式化的数据文件进行简单的字符串操作。我有一个特定的情况,我在网上搜寻了一些试图解决的问题,结果空白了。

这种情况。我有一个分为两部分的简单列表,格式如下:

name = ['PAUL;25','MARY;60','PAUL;40','NEIL;50','MARY;55','HELEN;25',...]

而且,我只需要保留任何重复名称一个实例(忽略';'右边的数字),仅保留具有最高数字的条目,以及仍附加的最高值。所以答案看起来像这样:

ans = ['MARY;60','NEIL;50,...]

列表中元素的顺序无关紧要,但ans列表条目的格式必须保持相同。

我大概可以想出一种蛮力的方法。我看过2D列表,集合,元组等。但是,我似乎找不到答案。名单上有大约一百万个条目,所以我需要高效的东西。我相信这对某些人来说会很容易。

感谢您可以提供的任何输入。

干杯。

炼金术士

解决方法

为此,最好的数据结构可能是字典,将条目拆分(并转换为整数),然后重新加入。

类似这样的东西:

max_score = {}
for n in name:
    person,score_str = n.split(';')
    score = int(score_str)
    if person not in max_score or max_score[person] < score:
        max_score[person] = score

ans = [
  '%s;%s' % (person,score)
  for person,score in max_score.items()
]

对于许多函数和程序来说,这是一个相当普遍的结构:首先将输入转换为内部表示(在这种情况下,将其拆分并转换为整数),然后进行逻辑或计算(在这种情况下,进行唯一性和最大值) ,然后转换为所需的输出表示形式(在这种情况下,该字符串用;分隔)。

就效率而言,此代码一次在每个输入项上查看一次,然后在每个输出项上查看一次;不可能有任何方法可以做得更好(肯定不是正式的,而且实际上可能不是)。所有每个项目的操作都是恒定时间和快速的。它将中间答案累积在内存中(在max_score中),但这又是不可避免的。如果存在内存问题,则可以将输入和输出更改为迭代器/生成器,但是必须在max_score中累积整个中间答案,然后才能输出任何项目。