我对以下解决方案的更多pythonic和高性能方法感兴趣。
def nthFrequent(arr,n):
d = dict((x, arr.count(x)) for x in set(arr))
value = sorted(d.values(), reverse=True)
# Pick nth repeated element
nthrepeat = value[n-1]
for (key, val) in d.iteritems():
if val == nthrepeat:
return key
a=[1,2,3,4,5,6,7,92,3,2,35,9,2,43,4,9,9,9]
print nthFrequent(a,2)
上面的代码将返回2,因为两次在9之后重复3次,这是4次。
我正在寻找使用lambda的更优雅方式,我尝试了以下方法,但未获得所需的结果。
max(((item, a.count(item)) for item in set(a)), key=lambda k: k[1])[0]
上面的一个将获得最大重复值,即。 9。
如何获得第二个或第n个?
答案 0 :(得分:4)
这与collections.Counter相当直接。但是,请注意,如果SELECT * FROM
(
SELECT *,
CASE
WHEN direction_or = 'Northwest' THEN 'NW'
WHEN direction_or = 'Southwest' THEN 'SW'
-- all other possibilities here
ELSE ''
END as direction_or_abb
FROM user.directions
) a
JOIN stored.directions b
ON a.direction_or_abb = b.direction_or
值更改为3,此解决方案将仅返回3或4中的一个,因为在这种情况下会有一个平局。
n
另外值得注意的是:元组的列表由元组的0索引元素排序。因此,您可以使用import collections
def nthFrequent(arr,n):
return sorted([(v, k) for k, v in collections.Counter(arr).items()], reverse=True)[n-1][1]
a = [1,2,3,4,5,6,7,92,3,2,35,9,2,43,4,9,9,9]
print nthFrequent(a,2)
的元组并返回该值。排序中不需要lambda。
如果你真的想在没有进口的情况下这样做,那么即使这样做也会更快:
(count, value)
如果您决定将来使用导入,那么也要给itertools看一看。它还有一些方便的工具
def nthFrequent3(arr, n):
d = {}
for v in arr:
if v not in d:
d[v] = 0
d[v] += 1
return sorted([(v, k) for k, v in d.items()], reverse=True)[n-1][1]
答案 1 :(得分:2)
如果您正在寻找单线,以下情况应该有效:
return sorted(((item, a.count(item)) for item in set(a)), key=lambda k: k[1], reverse=True)[n-1][0]
虽然上面使用了更多Python语言功能,但实际上我更喜欢原始代码的可读性。
作为旁注,在原始代码中,您应return key
,因为您当前正在尝试打印不返回值的函数。
如果你关心领带,就像@sberry提到的那样,你可以这样做:
当计数相同时获取最小值:
return sorted(((item, a.count(item)) for item in set(a)),
key=lambda k: (k[1], k[0]), reverse=True)[n-1][0]
当计数相同时获取最大值:
return sorted(((item, a.count(item)) for item in set(a)),
key=lambda k: (k[1], -k[0]), reverse=True)[n-1][0]
答案 2 :(得分:2)
让 N 的长度为entrySet()
,此行:
arr
按照 N 2 的顺序执行了许多步骤。首先,遍历d = dict((x, arr.count(x)) for x in set(arr))
以找到其唯一元素(最坏的情况是每个元素都是唯一的)。其次,对于每个唯一元素,再次遍历整个列表以计算该元素出现的次数。您的单行解决方案也是 N 2 的顺序。
这是不必要的重复步骤。您只需要查看arr
的每个元素一次。只需一步,您就可以:
检查您是否已经看过这个元素
增加此元素的计数器
像这样:
arr
在最坏的情况下,每个元素都是唯一的,由于排序,此代码按照 N * log(N)的顺序执行了许多步骤。 (传递counter = {}
for x in arr:
if x not in counter:
counter[x] = 0
counter[x] += 1
pairs = sorted(counter.iteritems(), key=lambda pair: pair[1], reverse=True)
key, count = pairs[n]
return key
的顺序为 N ,因为Python中的arr
查找的摊销顺序为1。)