繁体   English   中英

Python将元组列表转换为嵌套字典列表

[英]Python convert a list of tuples to a list of nested dicts

我有一个问题几乎使我发疯。

我正在用python编程,并且有一个元组列表:

my_tuples = [
    ('csrf_token', u'5bc7224ef8f71c8142b4bef1597883b049b83fee'),
    ('fields-team', u'dsada'),
    ('fields-year_from', u'dsa'),
    ('fields-year_to', u'dsa'),
    ('fields-description', u'dsa') ,
    ('fields-team', u''),
    ('fields-year_from', u''),
    ('fields-year_to', u''),
    ('fields-description', u'')
]

我必须将此元组列表转换为:

 form_data = {
     'csrf_token':u'5bc7224ef8f71c8142b4bef1597883b049b83fee',
     'fields':[
         {
             'team': u'dsada',
             'year_from': u'dsa',
             'year_to': u'dsa',
             'description': u'dsa'
         },
         {
             'team': u'',
             'year_from': u'',
             'year_to': u'',
             'description': u''
         }
     ]
 }

然后我必须删除第二个字典,因为每个键都有一个空值。 因此,最终结果将是:

 form_data = {
     'csrf_token':u'5bc7224ef8f71c8142b4bef1597883b049b83fee',
     'fields':[
         {
             'team': u'dsada',
             'year_from': u'dsa',
             'year_to': u'dsa',
             'description': u'dsa'
         }
     ]
 }

我的两分钱:

import collections

def transform(loft):
    form_data = collections.defaultdict(list)
    internal = {}
    numfield = 0
    for t in my_tuples:
        keys = t[0].split("-")
        if len(keys) == 1:
            form_data[keys[0]] = t[1]
        else:
            internal[keys[1]] = t[1]
            if numfield == 3:
                numfield = -1
                form_data[keys[0]].append(internal)
                internal = {}
            numfield += 1
    return form_data

if __name__ == "__main__":

    my_tuples = [
        ('csrf_token', u'5bc7224ef8f71c8142b4bef1597883b049b83fee'),
        ('fields-team', u'dsada'),
        ('fields-year_from', u'dsa'),
        ('fields-year_to', u'dsa'),
        ('fields-description', u'dsa') ,
        ('fields-team', u''),
        ('fields-year_from', u''),
        ('fields-year_to', u''),
        ('fields-description', u'')
    ]
    trans = transform(my_tuples)
    # cleanup
    trans['fields'] = [f for i, f in enumerate(trans['fields'])
        if trans['fields'][i]['team'] != ''
        and trans['fields'][i]['year_from'] != ''
        and trans['fields'][i]['year_to'] != ''
        and trans['fields'][i]['description'] != '']
    print dict(trans)

这个怎么样 :

def myfunc(my_tuples):
    mydict = {}
    d = {}
    for kv in my_tuples:
        if kv[0] == 'csrf_token':
            mydict[kv[0]] = kv[1].decode('ascii')
        elif 'fields' in kv[0]:
            d[kv[0]] = kv[1].decode('ascii')
    mydict['fields'] = [d]
    return mydict


def main():
    my_tuples = [
        ('csrf_token', u'5bc7224ef8f71c8142b4bef1597883b049b83fee'),
        ('fields-team', u'dsada'),
        ('fields-year_from', u'dsa'),
        ('fields-year_to', u'dsa'),
        ('fields-description', u'dsa'),
        ('fields-team', u''),
        ('fields-year_from', u''),
        ('fields-year_to', u''),
        ('fields-description', u'')
    ]

    myfunc(my_tuples)


if __name__ == "__main__":
    main()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM