如何计算列表中的重复总数并按名称对其进行排序

时间:2018-10-07 20:34:20

标签: python python-3.x

我希望计算列表中重复项的总数。然后以字母/数字顺序显示列表项的名称以及重复项的数量。

例如:

-列表
lst = [蓝色,绿色,绿色,黄色,黄色,黄色,橙色,橙色,银色,银色,银色,银色]

-按X计算重复次数

-以排序的列表名称顺序

打印列表项和输出的总次数

颜色:蓝色,总计:1
颜色:绿色,总计:2
颜色:橙色,总计:2
颜色:银色,总计:4
颜色:黄色,总计:3

我可以使用字典来完成上述操作,并将列表转换为集合。我的目标是使用Python 3的内置函数在列表类型内完成所有任务。

5 个答案:

答案 0 :(得分:0)

您可以将Countermost_common一起使用:

from collections import Counter

lst = ['blue', 'green', 'green', 'yellow', 'yellow', 'yellow', 'orange', 'orange', 'silver', 'silver', 'silver', 'silver']
freq = Counter(lst)

现在让我们按名称排序:

print(sorted(freq.most_common(), key=lambda x: x[0])) # [('blue', 1), ('green', 2), ('orange', 2), ('silver', 4), ('yellow', 3)]

更新

没有字典或计数器对象,“手动”方式是先按字母顺序对列表进行排序,然后在迭代时计算计数。因此,如下所示:

lst = ['blue', 'green', 'green', 'yellow', 'yellow', 'yellow', 'orange', 'orange', 'silver', 'silver', 'silver', 'silver']
lst.sort()

current_color = lst[0] # assuming lst is not empty
count = 0
for c in lst:
    if c == current_color:
        count += 1
    else:
        print('Color:', current_color, 'Total:', count)
        current_color = c
        count = 1
print('Color:', current_color, ', Total:', count) # print the last color

答案 1 :(得分:0)

为什么不看看收藏模块? 计数器功能将帮助您非常简单地实现目标。

答案 2 :(得分:0)

您可以使用itertools.groupby组合相同颜色的条目。它会生成(key, values)对的迭代器,其中value是匹配key的元素的生成器。

我使用简并的​​sum来计算值的数量,就像this answer一样,但是还有其他选择。

import itertools

lst = "blue green green yellow yellow yellow orange orange silver silver silver silver".split()

groups = sorted(((key, sum(1 for _ in values))
                 for (key, values) in itertools.groupby(lst)))

for color, count in groups:
    print("Color: {}, Total: {}".format(color, count))

答案 3 :(得分:0)

我建议您使用高性能计数器。计数器是一个容器,用于将元素存储为字典键,而其计数则存储为字典值。

import collections a = ["blue", "green", "green", "yellow", "yellow", "yellow", "orange", "orange", "silver", "silver", "silver", "silver"] counter = collections.Counter(a) colors = counter.keys() for color in colors: print 'Color: %s, Total: %d' % (color, counter[color])

答案 4 :(得分:0)

根据要求,不使用任何导入,这里仅使用str.count列表理解

lista = [
    'blue', 'green', 'green', 'yellow', 'yellow', 'yellow', 'orange', 
    'orange', 'silver', 'silver', 'silver', 'silver'
]

listb = []
for i in lista:
    if i not in listb:
        listb.append(i)

for i in sorted(listb):
    print('Color: {}, Total: {}'.format(i.ljust(6), lista.count(i)))
Color: blue  , Total: 1
Color: green , Total: 2
Color: orange, Total: 2
Color: silver, Total: 4
Color: yellow, Total: 3

老实说,您不需要很多工具来完成此操作,如果我刚使用过listb = set(lista),但您没有说set,那么我就把.ljust(6)投入到娱乐中并输出更漂亮