Python 将类对象计数器设置为可用列表

Python 将类对象计数器设置为可用列表,python,counter,Python,Counter,我使用了Counter类来获取迭代次数,现在我想将其格式化为: from collections import Counter elements = [1,6,9,4,1,2] elements.sort() Val=Counter(elements).keys() #Gives me all the values used : 1,2,4,6,9 Freq=Counter(elements).values() #Gives me the frequency : 2,1,1,1,1, # I w

我使用了Counter类来获取迭代次数,现在我想将其格式化为:

from collections import Counter
elements = [1,6,9,4,1,2]
elements.sort()
Val=Counter(elements).keys() #Gives me all the values used : 1,2,4,6,9
Freq=Counter(elements).values() #Gives me the frequency : 2,1,1,1,1,
# I want display somethink like : 
# 1 : 2
# 2 : 1
# 4 : 1
# 6 : 1
# 9 : 1

#I have tried : but it is a dict Type : I need to convert this Val et Freq to List
for i in range(0,len(Val)):
    print(str(Val[i]) +" : "str(Freq[i]))

您可以将它们转换为列表,然后
zip
它们:

from collections import Counter
elements = [1,6,9,4,1,2]
elements.sort()
Val=list(Counter(elements).keys()) #Gives me all the values used : 1,2,4,6,9
Freq=list(Counter(elements).values()) #Gives me the frequency : 2,1,1,1,1,

for i,j in zip(Val,Freq):
    print(str(i) + ":" + str(j))
输出:

1:2
2:1
4:1
6:1
9:1

您可以将它们转换为列表,然后
zip
它们:

from collections import Counter
elements = [1,6,9,4,1,2]
elements.sort()
Val=list(Counter(elements).keys()) #Gives me all the values used : 1,2,4,6,9
Freq=list(Counter(elements).values()) #Gives me the frequency : 2,1,1,1,1,

for i,j in zip(Val,Freq):
    print(str(i) + ":" + str(j))
输出:

1:2
2:1
4:1
6:1
9:1

您应该只构建一次
计数器。无法保证两个独立的
计数器
对象将以相同的顺序在其内容上迭代(另外,对于大的输入,这只是低效的)

这里的
sorted(Counter(elements).items())
是一个包含元组的排序列表
(val,freq)


[(1,2)、(2,1)、(4,1)、(6,1)、(9,1)]
您应该只构建一次
计数器。无法保证两个独立的
计数器
对象将以相同的顺序在其内容上迭代(另外,对于大的输入,这只是低效的)

这里的
sorted(Counter(elements).items())
是一个包含元组的排序列表
(val,freq)


[(1,2),(2,1),(4,1),(6,1),(9,1)]

这是可行的,但是当dict类型已经有了一个方法,其全部目的是并行地迭代键和值时,创建独立的iterable对象并将它们压缩在一起似乎有点迂回,为什么要转换为列表?在Python3.6之前,您的结果可能不会按排序顺序结束。正如Kevin提到的
Val=list(Counter(elements).keys());Freq=列表(计数器(元素).values());zip(Val,Freq)
是书写
计数器(elements.items()
的一种非常简便的方法。用
sorted()
将其包装起来,一切都很好。但这也是Patrick Haugh的答案。这是可行的,但创建独立的可编辑对象并将它们压缩在一起似乎有点迂回,因为dict类型已经有了一个方法,其全部目的是并行迭代键和值。而且,为什么要转换为列表?在Python3.6之前,您的结果可能不会按排序顺序结束。正如Kevin提到的
Val=list(Counter(elements).keys());Freq=列表(计数器(元素).values());zip(Val,Freq)
是书写
计数器(elements.items()
的一种非常简便的方法。用
sorted()
将其包装起来,一切都很好。但这也是Patrick Haugh的答案,虽然我不会指望两个计数器对象以相同的顺序迭代(如果只需要一个,我也不会浪费时间构建两个计数器对象),但是插入顺序会改变迭代顺序。考虑到这些计数器对象是在同一个进程中的同一次运行中,以相同的顺序从相同的数据创建的,如果迭代顺序出现分歧,我会感到惊讶。(同一进程中的同一次运行”免责声明是为了解释散列随机化。)@StevenRumbalski我能找到的关于这个主题的最接近文档的东西是:虽然这似乎意味着相同的iterables应该产生相同的dicts/计数器,这看起来绝对像是一种实现细节,围绕它构建代码是不安全的。虽然我不会指望两个计数器对象以相同的顺序迭代(当只需要一个计数器对象时,我也不会浪费时间构建两个计数器对象),但会改变迭代顺序的是插入顺序。考虑到这些计数器对象是在同一个进程中的同一次运行中,以相同的顺序从相同的数据创建的,如果迭代顺序出现分歧,我会感到惊讶。(同一进程中的同一次运行”免责声明是为了解释散列随机化。)@StevenRumbalski我能找到的关于这个主题的最接近文档的东西是:虽然这似乎意味着相同的iterables应该产生相同的dicts/计数器,这看起来绝对像是构建代码时不安全的实现细节。