2016-12-20 16 views
0

我有以下的集合:如何對象數組組即可,其它按鍵輸出

array = [ 
    {'key': 'val1', 'another_key': 'a'}, 
    {'key': 'val1', 'another_key': 'a'}, 
    {'key': 'val3', 'another_key': 'c'}, 
    {'key': 'val2', 'another_key': 'd'}, 
    {'key': 'val3', 'another_key': 'c'}, 
    {'key': 'val1', 'another_key': 'a'}, 
] 

我想按key1使用對象的數量。 對於上面的例子,我想明年選項之一:

[ 
    {'val1': 3, 'another_key': 'a'}, 
    {'val3': 2, 'another_key': 'c'}, 
    {'val2': 1, 'another_key': 'd'}, 
] 

[ 
    {'key':'val1', count: 3, 'another_key': 'a'}, 
    {'key':'val3', count: 2, 'another_key': 'c'}, 
    {'key':'val2', count: 1, 'another_key': 'd'}, 
] 

我想用Counter模塊。

我的代碼:

from collections import Counter 

groups = Counter([a['key'] for a in array]) 
groups = groups.most_common() 

但我只得到第一個鍵......

>>> groups 
[('val1', 3), ('val3', 2), ('val2', 1)] 

我怎樣才能獲得也是在上述格式之一的另一個重要?

+0

輸出是否需要是計數器還是可以用作臨時存儲器,然後以您給我們的格式存儲它?如果它需要是一個計數器,我們可以以某種方式更改輸出格式嗎? – Adirio

+0

可以臨時存儲 – user2503775

+0

如果2個數組元素具有相同的'key',它們也會具有相同的'another_key'? –

回答

1

由於沒有答案給你你要的輸出格式,你在這兒:

counter = Counter((item['key'], item['another_key']) for item in array) 
groups = [{t[0]: count, 'another_key': t[1]} for t, count in counter.most_common()] 

該解決方案爲您提供建議的第一個答案格式。

第二格式能夠獲得通過改變第二行:

groups = [{'count': count, 'key': t[0], 'another_key': t[1]} for t, count in counter.most_common()] 

由於@PM 2Ring後公佈,如果你不需要它排序counter.most_common()可以換成counter.items()

+0

FWIW,我沒有注意到你的答案,直到我發佈了我的。 –

+0

@ PM2Ring我們可能在同一時間寫作,你不擔心 – Adirio

0
counter = Counter([tuple(a.items()) for a in array]) 
print(counter) 
for tup, count in counter.items(): 
    print('-----') 
    print(tup) 
    print(tup[0][1]) 
    d = dict(tup) 
    print(d) 
    print(d['another_key']) 
    print(count) 

結果:

Counter({(('another_key', 'a'), ('key', 'val1')): 3, (('another_key', 'c'), ('key', 'val3')): 2, (('another_key', 'd'), ('key', 'val2')): 1}) 
----- 
(('another_key', 'c'), ('key', 'val3')) 
c 
{'another_key': 'c', 'key': 'val3'} 
c 
2 
----- 
(('another_key', 'a'), ('key', 'val1')) 
a 
{'another_key': 'a', 'key': 'val1'} 
a 
3 
----- 
(('another_key', 'd'), ('key', 'val2')) 
d 
{'another_key': 'd', 'key': 'val2'} 
d 
1 
+0

謝謝!我如何使用循環這個櫃檯? – user2503775

+0

@ user2503775我不明白。一個計數器是一個字典,所以你可以用同樣的方式。你想做什麼,你有什麼麻煩? –

+0

組完成後,我需要使用密鑰+ another_key。看看我之前有什麼:'對於鑰匙,分組計數:用鑰匙和另一個鑰匙做點什麼......' – user2503775

-1

添加一點,以你的理解:

groups = Counter(a[key] for a in array for key in a) 

,它可以是一臺發電機的表達,而不是一個列表理解。

+0

但是我得到了'Counter {'a':3,'val1':3,'c':2,'val3':2,'d':1,'val2':1})' – user2503775

+0

@ user2503775 - 對我來說很合適。 – TigerhawkT3

+0

'key'和'another_key'是不可拆分的對,您正在分別對它們進行計數。 – Adirio

1

只需將要保存的密鑰放入可排列的集合中;一個元組是完美的。然後,您可以通過迭代計數器中的元組和相關計數來輕鬆構建新的字典。

from collections import Counter 
from pprint import pprint 

arr = [ 
    {'key': 'val1', 'another_key': 'a'}, 
    {'key': 'val1', 'another_key': 'a'}, 
    {'key': 'val3', 'another_key': 'c'}, 
    {'key': 'val2', 'another_key': 'd'}, 
    {'key': 'val3', 'another_key': 'c'}, 
    {'key': 'val1', 'another_key': 'a'}, 
] 

groups = Counter((d['key'], d['another_key']) for d in arr) 

new_arr = [{'key': t[0], 'another_key': t[1], 'count': val} 
    for t, val in groups.items()] 

pprint(new_arr) 

輸出

[{'another_key': 'd', 'count': 1, 'key': 'val2'}, 
{'another_key': 'a', 'count': 3, 'key': 'val1'}, 
{'another_key': 'c', 'count': 2, 'key': 'val3'}] 

如果你想在遞減計數的順序,那麼你可以使用Counter.most_common方法排序列表:

ordered = [{'key': t[0], 'another_key': t[1], 'count': val} 
    for t, val in groups.most_common()] 
pprint(ordered)  

輸出

[{'another_key': 'a', 'count': 3, 'key': 'val1'}, 
{'another_key': 'c', 'count': 2, 'key': 'val3'}, 
{'another_key': 'd', 'count': 1, 'key': 'val2'}]