我正在使用Python 3.6和Django Framework。
我从用户那里得到了输入&这个输入在我的views.py中以字典的形式出现。可以说,用户输入3个值比我的字典保存值
my_dict = {'name1': abc, 'job1': xyz, 'pos1':tak, 'phone1': 12345, 'name2': pqr, 'job2': ftr, 'pos2': lkj, 'phone2': 27654, 'name3': swq, 'job3': nme, 'pos3': mnb, 'phone3': 98421}
我希望根据用户输入创建子词典,在上面的例子中3.预期的输出是
dict1 = {'name1': abc, 'job1': xyz, 'pos1': tak, 'phone1': 12345}
dict2 = {'name2': pqr, 'job2': ftr, 'pos2': lkj, 'phone2': 27654}
dict3 = {'name3': swq, 'job3': nme, 'pos3': mnb, 'phone3': 98421}
现在,这里的问题是我们不知道从用户那里获得了多少记录,因此也需要动态创建子词典。 " dict1"到" dictn"在哪里" n"是用户给出的数字。 请提出建议!
答案 0 :(得分:1)
您可以使用正则表达式为itertools.groupby
提供一个键函数,使用每个dict键末尾的任何数字序列来执行以下操作:
from itertools import groupby
import re
key = lambda s: int(re.search(r'(\d+)$', s).group(1))
d1, d2, d3 = [{k: my_dict[k] for k in g} for _, g in groupby(sorted(my_dict, key=key), key=key)]
这将按任何最终的数字序列对字典键进行排序和分组,并从结果组中构建单独的字典列表。
答案 1 :(得分:1)
此代码处理以字母开头并以数字结尾的任何键,该数字可包含任意数量的数字。如果找到一个不以数字结尾的密钥,则会输出错误信息,正确的程序应该做更好的错误处理。
它将每个结果字典保存到字典sub_dicts
中,因此不需要对输入数据进行排序。
import re
# Make a regex that finds the number
pat = re.compile(r'\d+')
my_dict = {
'name1': 'abc', 'job1': 'xyz', 'pos1': 'tak', 'phone1': 12345,
'name2': 'pqr', 'job2': 'ftr', 'pos2': 'lkj', 'phone2': 27654,
'name3': 'swq', 'job3': 'nme', 'pos3': 'mnb', 'phone3': 98421,
'bad': 'bad_data',
}
# Separate the data based on the trailing number of each key.
sub_dicts = {}
for k, v in my_dict.items():
m = pat.search(k)
if m:
num = m.group()
sub_dicts.setdefault(num, {})[k] = v
else:
print('Invalid key:', k, v)
for k in sub_dicts.keys():
print(sub_dicts[k])
<强>输出强>
Invalid key: bad bad_data
{'name1': 'abc', 'job1': 'xyz', 'pos1': 'tak', 'phone1': 12345}
{'name2': 'pqr', 'job2': 'ftr', 'pos2': 'lkj', 'phone2': 27654}
{'name3': 'swq', 'job3': 'nme', 'pos3': 'mnb', 'phone3': 98421}
答案 2 :(得分:0)
我不会创建单独的词典,但要么是词典词典,要么是在评论中建议的列表。这是第一种方法:
new_dict = dict()
for k, v in my_dict.iteritems():
k_ = k[-1]
if not new_dict.get(k_):
new_dict[k_] = dict()
new_dict[k_][k] = v
修改强> 要创建单独的词典(我不建议使用),您可以这样做:
for k, v in new_dict.iteritems():
globals()['dict' + k] = v
现在您有dict1
,dict2
等
答案 3 :(得分:0)
如果您想要每个分组结果的单独dict,那么您可以使用generator:
my_dict = {
'name1': 'abc', 'job1': 'xyz', 'pos1': 'tak', 'phone1': 12345,
'name2': 'pqr', 'job2': 'ftr', 'pos2': 'lkj', 'phone2': 27654,
'name3': 'swq', 'job3': 'nme', 'pos3': 'mnb', 'phone3': 98421,
'bad': 'bad_data',
}
group_dict=dict()
for key,value in my_dict.items():
if key[-1] not in group_dict:
group_dict[key[-1]]=[(key,value)]
else:
try:
group_dict[key[-1]].append((key,value))
except keyError:
pass
new_dict={}
def groups(x):
for key,value in x.items():
yield {x[0]: x[1] for x in value}
new=groups(group_dict)
print(new.__next__())
print(new.__next__())
print(new.__next__())
print(new.__next__())
输出:
{'bad': 'bad_data'}
{'pos2': 'lkj', 'name2': 'pqr', 'job2': 'ftr', 'phone2': 27654}
{'pos1': 'tak', 'name1': 'abc', 'phone1': 12345, 'job1': 'xyz'}
{'pos3': 'mnb', 'phone3': 98421, 'job3': 'nme', 'name3': 'swq'}
如果您想通过一个印刷品获得所有结果,那么:
print(list(groups(group_dict)))
[{'bad': 'bad_data'}, {'pos2': 'lkj', 'name2': 'pqr', 'job2': 'ftr', 'phone2': 27654}, {'pos1': 'tak', 'name1': 'abc', 'phone1': 12345, 'job1': 'xyz'}, {'pos3': 'mnb', 'phone3': 98421, 'job3': 'nme', 'name3': 'swq'}]