将嵌套列表转换为字典键和值

时间:2014-10-18 13:44:06

标签: python json list-comprehension nested-lists

我有一组通过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}

我不确定如何实现最后一步。

1 个答案:

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