我有一个GET
查询格式如下:
?title1=a&test1=b&title2=a&test2=b&..&titleN=a&testN=b
视图仅包含上面的代码
def index(request):
# This is my view
print request.GET.items():
这是我在运行查询时从视图中返回的结果:
{ 'title1':'a', 'test1':'b', 'title2':'a', 'test2':'b','titleN':'a', 'testN':'b' }
我想创建一个新的字典列表。
[
{
'title1' : 'a' ,
'test1':'b'
},
{
'title2' : 'a' ,
'test2':'b'
},
{
'titleN' : 'a',
'testN':'b'
}
]
您可以注意到我想按编号排列所有数据, N 这里是数字
问题是如何制作如上所述的清单, 唯一的约定是字典包含具有相同最后一个数字的键。
然后我希望列表变成这样:
[
{
'title' : 'a' ,
'test':'b'
},
{
'title' : 'a' ,
'test':'b'
},
{
'title' : 'a',
'test':'b'
}
]
答案 0 :(得分:2)
解决问题的一种方法是使用regularre表达式来提取数字,然后使用itertools
进行分组。
import re, itertools
# This is the grouper function; used first for sorting,
# then for actual grouping
def grouper(key):
return re.findall(r'\d+$',key[0])[0]
# Sort the dictionary by the number
sorted_dict = sorted(original_dict.items(), key=grouper)
# Group the sorted dictionary items and convert the groups into dicts
result = [dict(vals) for _,vals in (itertools.groupby(sorted_dict, key=grouper))]
#[{'title1': 'a', 'test1': 'b'},
# {'title11': 'a', 'test11': 'b'},
# {'title2': 'a', 'test2': 'b'}]
答案 1 :(得分:1)
假设测试和标题将从1开始的连续数字序列中保持整数后缀,下面是一种可能的方法,通过使用 list comprehension 实现此目的:
>>> my_dict = { 'title1':'a', 'test1':'b', 'title2':'a', 'test2':'b','title3':'a', 'test3':'b' }
>>> n = int(len(my_dict)/2)
>>> [{'title{}'.format(i), my_dict['title{}'.format(i)], 'test{}'.format(i), my_dict['test{}'.format(i)],} for i in range(1, n+1)]
[{'test1', 'b', 'a', 'title1'}, {'b', 'test2', 'a', 'title2'}, {'b', 'a', 'title3', 'test3'}]
我建议不要将params传递给你的apis:
title1=a&test1=b&title2=a&test2=b
你应该把它传递给:
title=a1,a2,a3&test=b1,b2,b3
原因是:所有值都应使用单个 title 和 test 参数进行映射。
在这种情况下,您的代码应为:
title = request.GET['title']
test = request.GET['test']
my_list = [{'title{}'.format(i): ti, 'test{}'.format(i): te } for i, (ti, te) in enumerate(zip(title, test))]
my_list
保留的值为:
[{'test0': 'b1', 'title0': 'a1'}, {'test1': 'b2', 'title1': 'a2'}, {'title2': 'a3', 'test2': 'b3'}]
答案 2 :(得分:1)
不熟悉django,所以可以有更有效的方法来做到这一点,但...... 您可以执行以下操作:
query_result = request.GET.items()
list_of_dicts = []
for i in range(1, N):
d ={'title'+str(i):d['title'+str(i)],'test'+str(i):d['test'+str(i)]}
list_of_dicts.append(d)
答案 3 :(得分:1)
笨重但仍然坚持:
result = sorted([{k:v,"title"+k[4:]:d["title"+k[4:]]} for k,v in d.items() if k.startswith("test")],key=lambda x : sorted(x.keys()))
testN
&创建子代码相应的titleN
键+值(快捷键:4是test
字符串的长度)结果:
[{'test1': 'b', 'title1': 'a'}, {'test2': 'b', 'title2': 'a'}, {'titleN': 'a', 'testN': 'b'}]
答案 4 :(得分:1)
这个不依赖于项目的顺序
import itertools
import re
num = re.compile('[0-9]+')
alpha = re.compile('[a-z]+')
query = { 'title1':'a', 'test1':'b', 'title2':'a', 'test2':'b','titleN':'a', 'testN':'b' }
result = [dict((num.sub('', w[0]), w[1]) for z, w in v) for i, v in itertools.groupby(((alpha.sub('', k), (k, v)) for k, v in query.items()), lambda x: x[0])]
# result:
# [{'test': 'b', 'title': 'a'},
# {'test': 'b', 'title': 'a'},
# {'testN': 'b', 'titleN': 'a'}]