2016-07-13 10 views
-1

Vor kurzem wurde ich ein Problem von einem Interviewer gegeben, der mir eine JSON-Datei gab, die wie folgt aussieht:den gleichen Wert vieler Wörterbuch in Python

{"id:"110235","symbol":"ccl","qty":"900","available":"35500","time":"2016-05-05T08:00:00.169646Z"} 
    {"id:"110235","symbol":"ccl","qty":"550","available":"16000","time":"2016-05-05T08:01:05.167356Z"} 
    {"id:"110235","symbol":"ssi","qty":"1550","available":"24000","time":"2016-05-05T08:01:07.173386Z"} 
    {"id:"110235","symbol":"tcl","qty":"270","available":"21340","time":"2016-05-05T08:01:15.089586Z"} 
    {"id:"110235","symbol":"ccl","qty":"690","available":"57840","time":"2016-05-05T08:01:24.236786Z"} 
    {"id:"110235","symbol":"tcl","qty":"740","available":"38540","time":"2016-05-05T08:01:28.145786Z"} 

Er will, dass ich die Werte aller available summieren, die haben das gleiche symbol.

Ich dachte über eine Reihe von symbol s und Schleife durch die JSON-Datei und Summe der Werte von available aber es ist langsam.

Was ist der effizienteste Weg, dies zu tun?

+0

Zuerst einige Code schreiben, das funktioniert. Dann mach es schneller wenn nötig. –

Antwort

0

Es ist nicht klar, was das erwartete Ausgabeformat ist, aber wenn es ein Wörterbuch sein kann, wäre das folgende O (n) Zeit.

def sum_symbols(data): 
    symbols = {} 

    for row in data: 
     symbol = symbols["symbol"] 
     available = int(row["available"]) 

     if symbol in symbols: 
      symbols[symbol] += available 
     else: 
      symbols[symbol] = available 

    return symbols 

sum_symbols(data) 
+1

kann mit 'collections.defaultdict (int)' –

+0

viel sauberer verbessert werden, danke! –

0
arr = [{"id": "110235", "symbol": "ccl", "qty": "900", "available": "35500", "time": "2016-05-05T08:00:00.169646Z"}, 
     {"id": "110235", "symbol": "ccl", "qty": "550", "available": "16000", "time": "2016-05-05T08:01:05.167356Z"}, 
     {"id": "110235", "symbol": "ssi", "qty": "1550", "available": "24000", "time": "2016-05-05T08:01:07.173386Z"}, 
     {"id": "110235", "symbol": "tcl", "qty": "270", "available": "21340", "time": "2016-05-05T08:01:15.089586Z"}, 
     {"id": "110235", "symbol": "ccl", "qty": "690", "available": "57840", "time": "2016-05-05T08:01:24.236786Z"}, 
     {"id": "110235", "symbol": "tcl", "qty": "740", "available": "38540", "time": "2016-05-05T08:01:28.145786Z"}] 

symbols = {} 
for a in arr: 
    if a["symbol"] in symbols: 
     symbols[a["symbol"]] += int(a["available"]) 
    else: 
     symbols[a["symbol"]] = int(a["available"]) 

print symbols 
2

Hier ist eine einfache Art und Weise tun:

from collections import defaultdict 

results = defaultdict(int) 
for data in data_set: 
    results[data['symbol']] += int(data['available']) 

for symbol, total in results.iteritems(): 
    print('{} - {}'.format(symbol, total)) 
Verwandte Themen