我感兴趣的是一种简洁的(+最优)方法来解决下面的问题,因为我很好奇如何以Pythonic的方式执行它.在执行另一项任务时,我试图制作一本包含任意元素的collections.Counter
字典:
d = Counter({('A','C'): 4, ('B','D','E'): 3, ..., ('A','G','V','X','Z'): 1, ('L','Z'): 1})
这里,每个元素都是一个元组,由2个或更多字符组成.我的目标是创建一个包含最常见项目with个重复项的列表uniquely by the number of elements in a tuple.例如,解决方案可能如下所示:
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')]
这里 Select ('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
如前所述,这似乎根本不是一个好办法.如有任何能更好地完成任务的见解,我们将不胜感激.