2017-09-16 3 views
0

J'ai eu moi-même un ensemble de données qui ressemble à ceci:en utilisant python pour compter des valeurs uniques et échelle en fréquence

[ 
    {'A':'0'}, 
    {'B':'0'}, 
    {'C':'1'} 
] 

Je voudrais métamorphoser en un ensemble de données qui ressemble à ceci:

[ 
    {'0':'2'}, 
    {'1':'1'} 
] 

Essentiellement la tâche compte les valeurs,

et pour chaque valeur unique

la création d'une nouvelle entrée dans une structure de données

pour chacune de ces entrées uniques (une fois de plus, sur la base des valeurs)

pour incrémenter l'entrée correspondante,

Fondamentalement, la tâche est le décompte de Nous avons toujours vu des valeurs uniques et nous les avons agrandies par le nombre de fois que la valeur a été exprimée.

Quelle est la manière la plus efficace et la plus efficace de le faire en python?

J'ai expérimenté avec comptoir, mais jusqu'à présent sans grand succès, que ma structure de données de base semble être incompatible, le code de base ressemble à ceci:

dict_hash_gas = list() 
for line in inpt: 
    resource = json.loads(line) 
    dict_hash_gas.append({resource['first']:resource['second']}) 

et l'ensemble de données comme ceci:

{"first":"A","second":"0","third":"2"} 
{"first":"B","second":"0","third":"2"} 
{"first":"C","second":"1","third":"2"} 

Répondre

1

Vous pouvez utiliser un Counter assez facilement:

>>> data = [ 
...  {'A':'0'}, 
...  {'B':'0'}, 
...  {'C':'1'} 
... ] 
>>> import collections 
>>> counts = collections.Counter(v for d in data for v in d.values()) 
>>> counts 
Counter({'0': 2, '1': 1}) 

Maintenant, pour obtenir la liste finale que vous voulez, tout simplement:

>>> [{k:v} for k,v in counts.items()] 
[{'0': 2}, {'1': 1}] 

Bien que, je ne sais pas pourquoi vous voulez une telle liste, je ne peux que supposer une API REST attend certains JSON dans ce format ...

+0

nice- merci beaucoup. En aparté, savez-vous pourquoi je l'imprime sur la console, il rend toujours comme ceci: Counter ({u'0 ': 2, u'1': 1}) ', c'est-à-dire avec' Counter' écrit là? est-il possible de le transformer en un dict normal? –

+0

aussi- recommanderiez-vous une façon particulière de transformer cela en un histogramme? –

+0

@ s.matthew.english parce que c'est un * 'Counter' * ... non? Si vous voulez une dict régulière, utilisez simplement 'dict (counts)'. Bien que vraiment, pourquoi le feriez-vous? –

1
result = dict() 

for name, value in input.items(): 
    result.update({value: result.get(value, 0) + 1}) 
+0

cela ne fonctionne pas, probablement parce que j'ai une liste de tuples- génère l'erreur suivante 'AttributeError: 'liste' objet n'a pas d'attribut 'items'' –

+0

Ne pas utiliser' .update', vous créez un dictionnaire intermédiaire que vous jetez immédiatement. Utilisez juste 'result [value] = result.get (value, 0) + 1', ou mieux encore, utilisez' Counter' ou 'defaultdict' et jetez l'appel à' .get' –