我对Python比较陌生。但是,我的需求通常只涉及对严格格式化的数据文件的简单字符串操作。我有一个特定的情况,我在网上搜索,试图解决,但一无所获。
情况就是这样。我有一个由两部分组成的条目的简单列表,格式如下:
name = ['PAUL;25', 'MARY;60', 'PAUL;40', 'NEIL;50', 'MARY;55', 'HELEN;25', ...]而且,我只需要保留任何重复名称的一个实例(忽略‘;’右侧的数字),只保留具有最高数字的条目,以及仍然附加的最高值。所以答案应该是这样的:
ans = ['MARY;60', 'PAUL;40', 'HELEN;25', 'NEIL;50, ...]元素在列表中的顺序是不相关的,但ans列表条目的格式必须保持不变。
我也许能想出一种暴力破解它的方法。我看过2D列表、集合、元组等,但我似乎找不到答案。名字列表大约有一百万个条目,所以我需要一些高效的条目。我相信对你们中的一些人来说,这将是非常容易的。
感谢您能提供的任何意见。
干杯。
碱土
发布于 2020-10-26 10:10:21
最好的数据结构可能是字典,将条目拆分(并转换为整数),然后重新连接。
如下所示:
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中累积整个中间答案。
https://stackoverflow.com/questions/64530643
复制相似问题