簡體   English   中英

Python-將元組分組的Dict

[英]Python - Tuple to grouped 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]
        ]
    }
    }

您還可以使用itertools庫,它具有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]})

在這里,您要進行groupby並使用元組的第一個鍵為其提供功能,例如,在這里lambda x: x[0] 在這種情況下,數據是每個組索引1和2的元素。

您還可以使用元組格式的轉換日期時間,如下所示:

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})
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)

您可以使用以下內容:

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"}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM