2017-02-14 20 views
0

私はこのタプルをデータベースから返してきました。このタプルは、ユーザーが毎日合計で何回ログインしたかを示しています。Python - タプルをグループ化するDict

mytuple = 
(
    ('jim', datetime.date(2017, 2, 10), 1L), 
    ('jeff', datetime.date(2017, 2, 11), 1L), 
    ('jeff', datetime.date(2017, 2, 12), 1L), 
    ('jeff', datetime.date(2017, 2, 13), 1L), 
    ('jeff', datetime.date(2017, 2, 14), 26L) 
) 

このようにDict/Jsonにどのようにフォーマットできますか?

mydict = { 
    { 
     name: 'jeff', 
     data: [ 
      [(2017, 2, 11), 1], 
      [(2017, 2, 12), 1], 
      [(2017, 2, 13), 1], 
      [(2017, 2, 14), 26] 
     ] 
    }, 
    { 
     name: 'jim', 
     data: [ 
      [(2017, 2, 10), 1] 
     ] 
    } 
    } 

答えて

0
import datetime 
import json 

mytype = (
    ('jim', datetime.date(2017, 2, 10), 1L), 
    ('jeff', datetime.date(2017, 2, 11), 1L), 
    ('jeff', datetime.date(2017, 2, 12), 1L), 
    ('jeff', datetime.date(2017, 2, 13), 1L), 
    ('jeff', datetime.date(2017, 2, 14), 26L) 
) 

mydict = {} 

for name, date, count in mytype: 
    if name not in mydict: 
     mydict[name] = [] 
    mydict[name].append(((date.year, date.month, date.day), count)) 

print mydict 
print json.dumps(mydict) 
+0

を、この目的の形式を取得できません。この場合、データはあなたにも、あまりにもタプル形式で次のように変換する日時を使用することができ、各グループインデックス1と2

の要素であります'name: 'jeff'' – asongtoruin

+0

@ason​​gtoruin私はそれが正確に希望のフォーマットではないが、あなたが言っている' jeff 'はどうですか? –

+0

'name'をキーとした辞書を質問すると、値としてではなくユーザの名前をキーとして提供しています – asongtoruin

0

あなたは以下のように使用できます。

import datetime 
import json 

mytype = (
    ('jim', datetime.date(2017, 2, 10), 1L), 
    ('jeff', datetime.date(2017, 2, 11), 1L), 
    ('jeff', datetime.date(2017, 2, 12), 1L), 
    ('jeff', datetime.date(2017, 2, 13), 1L), 
    ('jeff', datetime.date(2017, 2, 14), 26L) 
) 

output = [] 

def date_to_ymd_tuple(input_date): 
    return (input_date.year, input_date.month, input_date.day) 

for user in set(item[0] for item in mytype): 
    output.append({'name': user, 
        'data': [[date_to_ymd_tuple(x[1]), x[2]] for x in mytype if x[0] == user] 
        }) 

print output 

with open('output.txt', 'w') as f: 
    json.dump(output, f) 

[{"data": [[[2017, 2, 10], 1]], "name": "jim"}, {"data": [[[2017, 2, 11], 1], [[2017, 2, 12], 1], [[2017, 2, 13], 1], [[2017, 2, 14], 26]], "name": "jeff"}] 
1

を書き出しますあなたはどちらもitertoolsライブラリを使用することができ、それはそれをするgroupby機能を持っています。うまくいけば、大規模なデータセットを作成すると、これは高速になります。しかし、出力は辞書の代わりにリストになります。あなたが聞いたのと全く同じではありません。ここでは、groupbyを行うと、タプルなどの最初のキーを使用して、それのための機能を提供

import datetime 
from itertools import groupby 

mytuple = [('jim', datetime.date(2017, 2, 10), 1), 
    ('jeff', datetime.date(2017, 2, 11), 1), 
    ('jeff', datetime.date(2017, 2, 12), 1), 
    ('jeff', datetime.date(2017, 2, 13), 1), 
    ('jeff', datetime.date(2017, 2, 14), 26)] 

group_dict = [] 
for key, group in groupby(mytuple, lambda x: x[0]): 
    group_dict.append({'name': key, 'data': [[g[1], g[2]] for g in group]}) 

ここにlambda x: x[0]。ノート -

group_dict = [] 
for key, group in groupby(mytuple, lambda x: x[0]): 
    data = [[(g[1].year, g[1].month, g[1].day), g[2]] for g in group] 
    group_dict.append({'name': key, 'data': data}) 
+0

' itertools'の使用を考えなかった - nice!ありがとう@ason​​gtoruin! – asongtoruin

+0

!あなたの答えの代わりにちょうど:) – titipata

+0

素晴らしい仕事@アソルトトルン@タイタット!私は両方のコードをテストしてどれくらい速いかを確認しました.1回の実行でも同じように高速で実行され、正確な読み込みが困難でしたが、10,000回以上実行すると、@titatatsは平均0.181068181992秒@ason​​gtoruinは10秒以上でした。おそらく 'open( 'output.txt'、 'w')をf:' :)として使用しています。ファンタスティックな作業 – Slopax

関連する問題