栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在列表中找到最常见的元素

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在列表中找到最常见的元素

提出了这么多解决方案,令我惊讶的是没有人提出我认为很明显的解决方案(对于不可哈希但可比较的元素)-[

itertools.groupby
] [1]。
itertools
提供快速,可重用的功能,并允许您将一些棘手的逻辑委托给经过良好测试的标准库组件。考虑例如:

import itertoolsimport operatordef most_common(L):  # get an iterable of (item, iterable) pairs  SL = sorted((x, i) for i, x in enumerate(L))  # print 'SL:', SL  groups = itertools.groupby(SL, key=operator.itemgetter(0))  # auxiliary function to get "quality" for an item  def _auxfun(g):    item, iterable = g    count = 0    min_index = len(L)    for _, where in iterable:      count += 1      min_index = min(min_index, where)    # print 'item %r, count %r, minind %r' % (item, count, min_index)    return count, -min_index  # pick the highest-count/earliest item  return max(groups, key=_auxfun)[0]

当然,这可以写得更简洁一些,但我的目标是最大程度地清晰。

print
可以不加注释这两个语句,以更好地了解运行中的机制。例如, 带有未 注释的打印:

print most_common(['goose', 'duck', 'duck', 'goose'])

发出:

SL: [('duck', 1), ('duck', 2), ('goose', 0), ('goose', 3)]item 'duck', count 2, minind 1item 'goose', count 2, minind 0goose

如您所见,

SL
是一个成对的列表,每对一个项目,后跟原始列表中的项目索引(以实现关键条件,即,如果具有相同最高计数的“最常见”项目>
1,则结果必须是最早出现的一个)。

groupby
仅按项目分组(通过
operator.itemgetter
)。辅助功能在
max
计算过程中每分组一次调用,它接收并在内部解压缩一个组-
具有两个项目的元组,
(item, iterable)
其中可迭代项也是两个项目元组
(item, original index)
[[
SL
]的项目]。

然后,辅助功能使用循环来确定组可迭代项中的条目数
最小原始索引。它返回那些作为组合的“质量关键字”,并且最小索引符号已更改,因此该

max
操作将考虑“更好”那些在原始列表中较早出现的项目。

此代码可能是更简单的,如果它担心一 点点 时间和空间,少谈大O问题,如…:

def most_common(L):  groups = itertools.groupby(sorted(L))  def _auxfun((item, iterable)):    return len(list(iterable)), -L.index(item)  return max(groups, key=_auxfun)[0]

相同的基本思想,只是表达得更简单,紧凑…但是,可惜的是,额外的O(N)辅助空间(将组的可迭代对象体现到列表中)和O(N平方)时间(获取

L.index
每个项目的总和)
。尽管过早的优化是编程中所有弊端的根源,但在O(N log N)可用时刻意选择O(N平方)方法与可扩展性背道而驰!

最后,对于那些更喜欢“单线”而不是清晰度和性能的人,可以使用名称经过适当修饰的1线附加版本:-)。

from itertools import groupby as gdef most_common_oneliner(L):  return max(g(sorted(L)), key=lambda(x, v):(len(list(v)),-L.index(x)))[0]


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/639965.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号