2017-01-29 11 views
-2

У меня есть 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

ли ваш словарь иметь _все_ чисел от 1 до N? – DyZ

+0

Да, оно заканчивается номером, и оно содержит слово, подобное примеру, упомянутому выше, единственное, что важно, это число. –

ответ

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'}] 
1

Предполагая, что испытание и название будет держать целое суффикса в непрерывной серии чисел, начиная с 1, ниже возможным подходом через использование список понимания для достижения этой цели:

>>> 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 = 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'}] 
+1

Но что, если один из 'i' отсутствует? – DyZ

+2

@DYZ Проверьте начало моего ответа. Я уже упоминал, что я предполагаю, что так не будет. Если это так, мой ответ не будет работать;) –

1

не так хорошо знакомы с Джанго, так что может быть более эффективным способом сделайте это, но ... Вы можете сделать примерно следующее:

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) 
2

Одним из способов решения проблемы является использование выражений regulare для извлечения числа, а затем 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'}] 
+0

в результате чего содержится dict (vals)? –

+1

Он преобразует список кортежей в словарь. – DyZ

+0

Извините, я новичок в python, какова роль _? –

1

обременительно, но все еще Oneliner:

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())) 
  • создать суб-dicts с testN & соответствующие titleN клавиши + значения (ярлык: 4 длина test строки)
  • Сортировка список в соответствии с отсортированным списком ключей

результат:

[{'test1': 'b', 'title1': 'a'}, {'test2': 'b', 'title2': 'a'}, {'titleN': 'a', 'testN': 'b'}]