根据元素在列表中出现的次数打印输出

时间:2018-10-09 14:13:49

标签: python

当前,我有一个包含以下内容的列表:

lst = [[2],[2,2],[2,2,2,3,3],[2,3,5,5]]

,我正在尝试以以下格式打印:

2^1             #since there is only one '2'   
2^2             #since there are two '2' in the first list
2^3 | 3^2       #three '2' and two '3'
2^1 | 3^1 | 5^2 #one '2', one '3' and two '5'

我尝试过:

for i in range(len(lst)):
    count = 1
    if len(lst[i]) == 1:
        print(str(lst[i][0]) + "^" + str(count))
    else:
        for j in range(len(lst[i])-1):
            if lst[i][j] == lst[i][j+1]:
                count+=1
            else:
                print(str(lst[i][j]) + "^" + str(count) + " | " +str(lst[i][j+1]) + "^" +str(count)) 
        if count == len(lst[i]):
            print(str(lst[i][j]) + "^" + str(count))

但是我得到了

的输出
2^1
2^2
2^3 | 3^3
2^1 | 3^1
3^1 | 5^1

希望对此有所帮助

2 个答案:

答案 0 :(得分:2)

使用itertools.Counter

的简单变体
from collections import Counter

for sublist in lst:
    c = Counter(sublist)
    print(' | '.join(f'{number}^{mult}' for number, mult in c.items()))

这使Counter可以进行计数,并仅以所需的格式显示项目。

Counter对象的作用就像字典一样(列表中的最后一项):

c = Counter({5: 2, 2: 1, 3: 1})

dict一样,您可以使用key, value遍历c.items()对。格式字符串f'{number}^{mult}'然后生成类似5^2的字符串,然后使用分隔符' | ' join对其进行修饰。

答案 1 :(得分:0)

您可以使用 itertools.groupby 唯一的问题是印刷品上的尾随|

from itertools import groupby

lst = [sorted(i) for i in lst]
for i in lst:
    for k, g in groupby(i):
        print('{}^{} | '.format(k, len(list(g))), end='')
    print()
2^1 | 
2^2 | 
2^3 | 3^2 | 
2^1 | 3^1 | 5^2 |