词典拆分/理解

2024-04-25 17:24:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字典,我想分成一个字典列表,用于将提交添加到数据库中

这是字典,这不是一个静态的dict,它是动态生成的,因此数字可以增加

# notice the keys are all grouped by numbers, 

 data = {'resident_payer,1': 'William Brown',
        'Term Fee,amount_paid,1': '1',
        'method,1': 'credit',
        'document_id,1': '1',

        'resident_payer,2': None,
        'Term Fee,amount_paid,2': '0',
        'method,2': 'other',
        'document_id,2': '0'}

我需要一个字典列表,如下所示:

[
{'resident_payer': 'William Brown', 'Term Fee,amount_paid': '1', 'method': 'credit', 'document_id': '1'},
{'resident_payer': None, 'Term Fee_amount_paid': '0', 'method': 'other', 'document_id': '0'}
]

我如何用听写理解的简单方法来做这件事

这里是工作代码,但我无法找出解决方案,因为我正在使用和清除循环外声明的变量,因此我希望使用一种更清晰的python方式来编写此代码

data = {'resident_payer,1': 'William Brown',
        'Term Fee,amount_paid,1': '1',
        'method,1': 'credit',
        'document_id,1': '1',

        'resident_payer,2': None,
        'Term Fee,amount_paid,2': '0',
        'method,2': 'other',
        'document_id,2': '0'}

# will hold broken down lists
list_of_submissions = list()
# used to parse data into separated list of dictionaries.
# The key is split into numbers for grouping
current_loop = 1
active_dict_to_add_to_list = dict()
for key, value in data.items():
    if f'{current_loop}' in key:
        # we are in the current iteration
        # add the item to the active dict, the key is split by the ',' and [1] is the number so [0] needs to be selected
        # slice by 0: -1 to get first to everything but last element
        key_to_use = ",".join(key.split(',')[0:-1])

        active_dict_to_add_to_list[key_to_use] = value
        print(active_dict_to_add_to_list)
        # I know the dict should be 4 in length s I can realize I need to add here, but I don't like that...
        if len(active_dict_to_add_to_list) == 4:
            list_of_submissions.append(active_dict_to_add_to_list)
            # print('added', active_dict_to_add_to_list)
            active_dict_to_add_to_list = dict()
            current_loop += 1
    else:
        # we need to move to new iteration
        # add the current active dict to the list of submissions
        list_of_submissions.append(active_dict_to_add_to_list)
        print('added', active_dict_to_add_to_list)
        # clear the active dict so it can be added again
        active_dict_to_add_to_list = dict()
        current_loop += 1

print(list_of_submissions)


Tags: thetokeyaddamountdocumentmethoddict
3条回答

您可以使用^{}

from itertools import groupby
[{k.split(',')[0]: v for k, v in g} for i, g in groupby(data.items(), key=lambda x: x[0].split(',')[-1])]

结果:

[{'resident_payer': 'William Brown', 'Term Fee': '1', 'method': 'credit', 'document_id': '1'},
 {'resident_payer': None, 'Term Fee': '0', 'method': 'other', 'document_id': '0'}]
data = {'resident_payer,1': 'William Brown',
        'Term Fee,amount_paid,1': '1',
        'method,1': 'credit',
        'document_id,1': '1',

        'resident_payer,2': None,
        'Term Fee,amount_paid,2': '0',
        'method,2': 'other',
        'document_id,2': '0'}

out = {}
for k, v in data.items():
    # all but last element
    key_to_use = ",".join(k.split(',')[0:-1])
    out.setdefault(k.split(',')[-1], {})[key_to_use] = v

out = list(out.values())

print(out)

印刷品:

[{'resident_payer': 'William Brown', 'Term Fee': '1', 'method': 'credit', 'document_id': '1'}, {'resident_payer': None, 'Term Fee': '0', 'method': 'other', 'document_id': '0'}]

这是我能合理减少的范围:

from pprint import pprint

data = {'resident_payer,1': 'William Brown',
        'Term Fee,amount_paid,1': '1',
        'method,1': 'credit',
        'document_id,1': '1',

        'resident_payer,2': None,
        'Term Fee,amount_paid,2': '0',
        'method,2': 'other',
        'document_id,2': '0'}

out1 = {}
for k, v in data.items():
    newk, subid = k.rsplit(",", 1)
    out1.setdefault(subid, {})[newk] = v

out = [out1[k] for k in sorted(out1.keys(), key=int)]

pprint(out)

给出:

[{'Term Fee,amount_paid': '1',
  'document_id': '1',
  'method': 'credit',
  'resident_payer': 'William Brown'},
 {'Term Fee,amount_paid': '0',
  'document_id': '0',
  'method': 'other',
  'resident_payer': None}]

这是假设您希望输出列表按照用于对条目进行分组的数字(在中间字典out1中用作键)的顺序进行排序

相关问题 更多 >

    热门问题