根据提供的输入动态地将字典拆分为python3.6中的多个字典

时间:2017-10-13 07:05:40

标签: python django python-3.x dictionary

我正在使用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"是用户给出的数字。 请提出建议!

4 个答案:

答案 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

现在您有dict1dict2

答案 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'}]