2014-10-18 1 views
0

У меня есть набор вложенных списков, возвращаемых с веб-сайта с помощью запроса XHR. Используемая методика составляет json.loads по адресу response.text. Вложенный список выглядит следующим образом:Конвертированный вложенный список в словарь и значение

[[[[u'goal', u'openplay', u'leftfoot', [2]], 
    [u'goal', u'openplay', u'rightfoot', [7]], 
    [u'goal', u'owngoal', u'rightfoot', [1]], 
    [u'miss', u'corner', u'header', [1]], 
    [u'miss', u'corner', u'otherbodypart', [1]], 
    [u'miss', u'corner', u'rightfoot', [2]], 
    [u'miss', u'crossedfreekick', u'leftfoot', [1]], 
    [u'miss', u'crossedfreekick', u'rightfoot', [6]], 
    [u'miss', u'openplay', u'header', [2]], 
    [u'miss', u'openplay', u'leftfoot', [11]], 
    [u'miss', u'openplay', u'rightfoot', [31]], 
    [u'miss', u'throwin', u'rightfoot', [1]]]]] 

Если предположить, что этот вложенный список был введен в переменную events Я использую следующий код:

for y in events[0]: 
    for sub in y: 
     print sub 

я получаю выход так:

[u'goal', u'openplay', u'leftfoot', [2]] 
[u'goal', u'openplay', u'rightfoot', [7] 
... 
... 
... 
[u'miss', u'openplay', u'leftfoot', [11] 
[u'miss', u'openplay', u'rightfoot', [31] 

Однако я хочу превратить первую часть вложенного списка, то есть u'goal', u'openplay', u'leftfoot' в ключ словаря и вторую часть значения, то есть [1]. Это должно было бы сделать следующее:

{"'goal', u'openplay', u'leftfoot'":2} 
{"'goal', u'openplay', u'rightfoot'":7} 
... 
... 
... 
{"'miss', u'openplay', u'leftfoot'":11} 
{"'miss', u'openplay', u'rightfoot'":31} 

Я не совсем уверен, как достичь этого последнего шага.

+0

* Используемая техника - json.loads на response.text. * Вместо этого используйте 'response.json()'. –

+0

Ваш образец вывода не имеет особого смысла в качестве отдельных словарей, кстати. Мой ответ дает вам * один * словарь, а ваши запрошенные ключи - как кортежи. В конце концов, ключ словаря все равно должен быть одним объектом. –

ответ

1

Вы можете превратить первые три элемента в кортеж для ключа. Это может быть сделано с помощью словаря понимания:

{tuple(sub[:3]): sub[3][0] for y in events[0] for sub in y} 

Таким образом, первые 3 элементов выполнены в ключ кортежа, а целое число от 4-го элемента разворачивает для словаря значения.

Демо:

>>> from pprint import pprint 
>>> events = [[[[u'goal', u'openplay', u'leftfoot', [2]], [u'goal', u'openplay', u'rightfoot', [7]], [u'goal', 
... u'owngoal', u'rightfoot', [1]], [u'miss', u'corner', u'header', [1]], [u'miss', u'corner', 
... u'otherbodypart', [1]], [u'miss', u'corner', u'rightfoot', [2]], [u'miss', u'crossedfreekick', 
... u'leftfoot', [1]], [u'miss', u'crossedfreekick', u'rightfoot', [6]], [u'miss', u'openplay', u'header', 
... [2]], [u'miss', u'openplay', u'leftfoot', [11]], [u'miss', u'openplay', u'rightfoot', [31]], [u'miss', 
... u'throwin', u'rightfoot', [1]]]]] 
>>> {tuple(sub[:3]): sub[3][0] for y in events[0] for sub in y} 
{(u'goal', u'owngoal', u'rightfoot'): 1, (u'miss', u'corner', u'header'): 1, (u'miss', u'corner', u'otherbodypart'): 1, (u'goal', u'openplay', u'leftfoot'): 2, (u'miss', u'openplay', u'rightfoot'): 31, (u'miss', u'corner', u'rightfoot'): 2, (u'miss', u'crossedfreekick', u'rightfoot'): 6, (u'miss', u'throwin', u'rightfoot'): 1, (u'miss', u'openplay', u'header'): 2, (u'goal', u'openplay', u'rightfoot'): 7, (u'miss', u'openplay', u'leftfoot'): 11, (u'miss', u'crossedfreekick', u'leftfoot'): 1} 
>>> pprint(_) 
{(u'goal', u'openplay', u'leftfoot'): 2, 
(u'goal', u'openplay', u'rightfoot'): 7, 
(u'goal', u'owngoal', u'rightfoot'): 1, 
(u'miss', u'corner', u'header'): 1, 
(u'miss', u'corner', u'otherbodypart'): 1, 
(u'miss', u'corner', u'rightfoot'): 2, 
(u'miss', u'crossedfreekick', u'leftfoot'): 1, 
(u'miss', u'crossedfreekick', u'rightfoot'): 6, 
(u'miss', u'openplay', u'header'): 2, 
(u'miss', u'openplay', u'leftfoot'): 11, 
(u'miss', u'openplay', u'rightfoot'): 31, 
(u'miss', u'throwin', u'rightfoot'): 1} 

Обратите внимание, что requests дает прямой доступ к расшифровке ответа JSON; используйте response.json() вместо использования json.loads() по адресу response.content или response.text.

+0

спасибо, что ответили. ваш ответ выглядит хорошо. я проверю его позже и приму ответ, если он сработает для меня. – gdogg371

+0

Кстати, это был не тот, который отклонил ваш ответ! – gdogg371