字典 Splitting/Comprehension
Dictionary Splitting/Comprehension
我有一本字典,我想拆分成一个字典列表,以便将提交内容添加到数据库中。
这是字典,这不是静态字典,它是动态生成的,所以数字可以增加:
# 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'}
]
我怎样才能通过听写理解以简单的方式做到这一点?
这是工作代码,但我无法在没有看起来奇怪的复杂性的情况下找到解决方案,因为我正在使用和清除在我的循环外声明的变量,所以我想要一种更清晰的 pythonic 方式来编写它。
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)
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'}]
试试这个,KeyError
一旦用完所有索引就中断循环。
start_index, parsed_dict = 1, []
keys = ["resident_payer", "Term Fee,amount_paid",
"Term Fee,amount_paid", "method", "document_id"]
while True:
try:
for key in keys:
parsed_dict.append({key: data[key + "," + str(start_index)]})
except KeyError:
break
start_index += 1
print(parsed_dict)
输出,
[{'resident_payer': 'William Brown'}, {'Term Fee,amount_paid': '1'}, {'Term Fee,amount_paid': '1'}, {'method': 'credit'}, {'document_id': '1'},
{'resident_payer': None}, {'Term Fee,amount_paid': '0'}, {'Term Fee,amount_paid': '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
中用作键)的顺序排序。
你可以利用itertools.groupby
:
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'}]
我有一本字典,我想拆分成一个字典列表,以便将提交内容添加到数据库中。
这是字典,这不是静态字典,它是动态生成的,所以数字可以增加:
# 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'}
]
我怎样才能通过听写理解以简单的方式做到这一点?
这是工作代码,但我无法在没有看起来奇怪的复杂性的情况下找到解决方案,因为我正在使用和清除在我的循环外声明的变量,所以我想要一种更清晰的 pythonic 方式来编写它。
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)
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'}]
试试这个,KeyError
一旦用完所有索引就中断循环。
start_index, parsed_dict = 1, []
keys = ["resident_payer", "Term Fee,amount_paid",
"Term Fee,amount_paid", "method", "document_id"]
while True:
try:
for key in keys:
parsed_dict.append({key: data[key + "," + str(start_index)]})
except KeyError:
break
start_index += 1
print(parsed_dict)
输出,
[{'resident_payer': 'William Brown'}, {'Term Fee,amount_paid': '1'}, {'Term Fee,amount_paid': '1'}, {'method': 'credit'}, {'document_id': '1'},
{'resident_payer': None}, {'Term Fee,amount_paid': '0'}, {'Term Fee,amount_paid': '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
中用作键)的顺序排序。
你可以利用itertools.groupby
:
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'}]