Pythonic 方法来计算计数器中重复项的最频繁项,分别按元素数?
Pythonic way to count the most frequent items with duplicates in Counter, separately by number of elements?
我对解决以下问题的简洁(+最佳)方法很感兴趣,因为我很好奇如何以 Pythonic 方式执行它。在做一个单独的任务时,我试图制作一个包含任意元素的 collections.Counter
字典:
d = Counter({('A','C'): 4, ('B','D','E'): 3, ..., ('A','G','V','X','Z'): 1, ('L','Z'): 1})
这里,每个元素都是一个元组,由2个或多个字符组成。我的目例如,解决方案可能如下所示:
d_sample = Counter({('A', 'C'): 4, ('B', 'D', 'E'): 3, ('A' ,'D'): 3, ('C', 'D', 'E'): 3,
('A', 'B', 'C', 'D', 'E'): 2, ('A', 'C', 'D', 'E'): 1,
('B', 'C', 'D', 'E'): 1, ('D', 'E'): 1})
result = [('A', 'C'), ('B', 'D', 'E'), ('C', 'D', 'E'), ('A', 'B', 'C', 'D', 'E'),
('A', 'C', 'D', 'E'), ('B', 'C', 'D', 'E')]
这里选择了('A', 'C')
,因为它是有两个元素的元组中计数最高的。 ('B', 'D', 'E')
和 ('C', 'D', 'E')
都被选中,因为它们是具有最高计数的三个元素的元组。 result
列表中的其他元素也是如此。
我想到的方法是使用for
循环从d
中提取几个列表,按元素数分隔:for i in range(2, # maximum elements using another for loop)
。从那里,我使用另一个 for
循环和 max()
.
计算频率最高的项目
# pseudo-example:
maxval = 2
for x in d:
if len(x[0]) > maxval:
maxval = len(x[0])
counter_list = [[] * n for n in range(maxval-2)]
for x in d:
counter_list[len(x[0])-2].append(x)
## selecting max per list
正如所阐述的那样,这似乎根本不是 Pythonic 和最佳的。任何更优化地交付任务的见解将不胜感激。
这是 O(n),我认为不可能渐进地比这更好。
highest_count_for_length = {}
result = []
for tup, count in d.items():
try:
if highest_count_for_length[len(tup)] == count:
result.append(tup)
except KeyError:
# we haven't seen this length yet
highest_count_for_length[len(tup)] = count
result.append(tup)
它确实依赖于输入已经按值排序的事实。
我对解决以下问题的简洁(+最佳)方法很感兴趣,因为我很好奇如何以 Pythonic 方式执行它。在做一个单独的任务时,我试图制作一个包含任意元素的 collections.Counter
字典:
d = Counter({('A','C'): 4, ('B','D','E'): 3, ..., ('A','G','V','X','Z'): 1, ('L','Z'): 1})
这里,每个元素都是一个元组,由2个或多个字符组成。我的目例如,解决方案可能如下所示:
d_sample = Counter({('A', 'C'): 4, ('B', 'D', 'E'): 3, ('A' ,'D'): 3, ('C', 'D', 'E'): 3,
('A', 'B', 'C', 'D', 'E'): 2, ('A', 'C', 'D', 'E'): 1,
('B', 'C', 'D', 'E'): 1, ('D', 'E'): 1})
result = [('A', 'C'), ('B', 'D', 'E'), ('C', 'D', 'E'), ('A', 'B', 'C', 'D', 'E'),
('A', 'C', 'D', 'E'), ('B', 'C', 'D', 'E')]
这里选择了('A', 'C')
,因为它是有两个元素的元组中计数最高的。 ('B', 'D', 'E')
和 ('C', 'D', 'E')
都被选中,因为它们是具有最高计数的三个元素的元组。 result
列表中的其他元素也是如此。
我想到的方法是使用for
循环从d
中提取几个列表,按元素数分隔:for i in range(2, # maximum elements using another for loop)
。从那里,我使用另一个 for
循环和 max()
.
# pseudo-example:
maxval = 2
for x in d:
if len(x[0]) > maxval:
maxval = len(x[0])
counter_list = [[] * n for n in range(maxval-2)]
for x in d:
counter_list[len(x[0])-2].append(x)
## selecting max per list
正如所阐述的那样,这似乎根本不是 Pythonic 和最佳的。任何更优化地交付任务的见解将不胜感激。
这是 O(n),我认为不可能渐进地比这更好。
highest_count_for_length = {}
result = []
for tup, count in d.items():
try:
if highest_count_for_length[len(tup)] == count:
result.append(tup)
except KeyError:
# we haven't seen this length yet
highest_count_for_length[len(tup)] = count
result.append(tup)
它确实依赖于输入已经按值排序的事实。