Django - 获取查询参数并将其放入字典列表中

时间:2017-01-29 20:42:07

标签: python django algorithm django-views pycharm

我有一个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'
    }
]

5 个答案:

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