2014-10-17 44 views
-3

喜的Python用戶,Python中的集合模塊行爲奇怪嗎?

我不是100%肯定,但它似乎有在蟒蛇的錯誤功能collections.Counter()這是collections模塊中的一部分。函數collections.Counter()應計算列表中數字的出現次數,換句話說,它應該確定列表(矢量)中數字的出現頻率。如果這些數字是浮點數或整數,這應該不重要。在很多場合它正常但不是做這項工作始終,這裏是當它不能給出正確答案的例子:

import numpy as np 
from itertools import groupby 
import collections 
import matplotlib.pyplot as plt 

data_1=[250, 250, 251, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 254, 254, 254, 254, 254] 
data_2=[250, 250, 251, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 254, 254, 254, 254, 254, 255, 256, 256] 

# Determine no. of repetitions for the sweeped wavelengths 
d2=collections.Counter(data_1) # BUG in the collections module for data_2 but NOT for data_1 
d3=d2.values() 

print d3 

data_1名單上使用collections.Counter將給出正確的答案(D3)的所有事件:

[2, 4, 4, 4, 5] 

但是,如果我在data_2申請collections.Counter我得到以下答案(D3):

[2, 2, 4, 4, 4, 5, 1] 

這是WR翁。它應該是[2, 4, 4, 4, 5, 1, 2]。看起來像collections.Counter()交換了一些元素,但我找不到任何合理的解釋,爲什麼它這樣做。順便說一句。我正在使用Python 2.7.5

對此有什麼意見?

PS1:字典功能dict((i,data_2.count(i)) for i in data_2)對於data_2給出與collections.Counter(data_2)相同的錯誤答案。

PS2:該解決似乎是從itertools模塊groupby功能:

from itertools import groupby 
d3=[len(list(group)) for key, group in groupby(data_2)] 
+3

道德:總是假設的錯誤更可能是你的比你正在使用的語言。 – 2014-10-17 14:45:32

+0

感謝您的評論凱文:-) data_2.count()函數工作正常,但字典似乎隨機命令輸出元素和尊重值,如你所說。 – Commi 2014-10-17 14:51:07

+0

親愛的零比雷埃夫斯,我沒有犯錯。嘗試編譯我的代碼並查看。 – Commi 2014-10-17 14:54:43

回答

2

collections.Counterdict的亞型。字典沒有訂單。因此,您在Counter對象(字典!)上使用d.values()的輸出是任意的,可能不是您想要的。

如果您想訂購您通過密鑰得到的值,你應該重點首先值進行排序,然後返回值:

>>> [v for k, v in sorted(Counter(data_1).items(), key=lambda x: x[0])] 
[2, 4, 4, 4, 5] 
>>> [v for k, v in sorted(Counter(data_2).items(), key=lambda x: x[0])] 
[2, 4, 4, 4, 5, 1, 2] 
+0

祝福你打個招呼:-)使用集合的人有很多例子。計數器()用於數字計數,無需排序。你是頂尖的:-) – Commi 2014-10-17 14:58:55

2

在字典中的項目順序是具體實施的行爲。計數器可以按照自己想要的順序排列鍵值對。這是按預期工作的。

按照official documentation

鍵和值遍歷在非隨機的,不同的Python實現不同而不同,取決於插入和刪除的字典的歷史以任意順序。