与这个复杂的嵌套列表混淆

时间:2014-10-15 21:52:28

标签: python json list-comprehension

我有以下代码用于返回嵌套的列表集:

url = 'http://www.whoscored.com/stagestatfeed/9155/stageteams/'
                    url = str(''.join(url[0:3]))
                    params = {
            'against': '0',            
            'field': '0',
            'teamId': '-1',
            'type': '8'
            }

                    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36',
           'X-Requested-With': 'XMLHttpRequest',
           'Host': 'www.whoscored.com',
           'Referer': 'http://www.whoscored.com/'}

                    responser = requests.get(url, params=params, headers=headers)

                    responser = json.loads(responser.text.replace("'", '"').decode('cp1252'))

以前我会在这一点上作弊,只是删除了responser.text中的所有括号,但是我想尝试使用列表理解而不是json.loads()返回的项目。而不是让响应者返回:

    [[[13, u'Arsenal', [[[[u'goal', u'corner', u'rightfoot', [1]], [u'goal', u'crossedfreekick', 
    u'header', [1]], [u'goal', u'openplay', u'rightfoot', [3]], [u'miss', u'corner', u'header', [2]], 
    [u'miss', u'corner', u'leftfoot', [1]], [u'miss', u'corner', u'rightfoot', [1]], [u'miss', 
    u'crossedfreekick', u'header', [1]], [u'miss', u'crossedfreekick', u'leftfoot', [2]], [u'miss', 
    u'directfreekick', u'rightfoot', [1]], [u'miss', u'fastbreak', u'rightfoot', [1]], [u'miss', 
    u'openplay', u'leftfoot', [12]], [u'miss', u'openplay', u'rightfoot', [19]]]]]], [14, u'Leicester', 
    [[[[u'goal', u'openplay', u'leftfoot', [1]], [u'miss', u'crossedfreekick', u'header', [1]], 
[u'miss', u'crossedfreekick', u'rightfoot', [2]], [u'miss', u'fastbreak', u'rightfoot', [1]], 
[u'miss', u'openplay', u'leftfoot', [7]], [u'miss', u'openplay', u'rightfoot', [9]]]]]]
    ....
    ....
    ....
 [171, u'Queens Park Rangers', [[[[u'goal', u'openplay', u'leftfoot', [1]], [u'miss', u'corner', 
u'header', [5]], [u'miss', u'crossedfreekick', u'header', [1]], [u'miss', u'directfreekick', 
u'rightfoot', [2]], [u'miss', u'openplay', u'header', [1]], [u'miss', u'openplay', u'leftfoot', [4]],
 [u'miss', u'openplay', u'rightfoot', [23]], [u'miss', u'throwin', u'header', [1]]]]]]]]

...这只是来自源的一系列嵌套列表,我试图使用选择性列表解析从嵌套列表中提取某些值:

goal1 = {"'goal','openplay','leftfoot'", "'goal','openplay','rightfoot'", "'goal','openplay','header'", "'goal','openplay','otherbodypart'"}
                    responser1 = sum(int(value) for key, value in responser if key in goal1)

print responser1

我想要的是由嵌套列表中的每个足球队进行这种选择性理解。例如,我的输出可能如下所示:

arsenal,5,3,1,1
liverpool,4,1,0
...
...
...
hull,5,3,1,2
burnley,2,1,1,0

但是,当我运行此代码时,出现以下错误:

regex1 = sum(int(value) for key, value in regex if key in goal1)
    exceptions.ValueError: too many values to unpack

...我不知道如何解决。任何人都可以为我建议一种语法,将我的源数据转换为我想要的最终输出吗?

由于

1 个答案:

答案 0 :(得分:0)

您当前的代码存在许多问题。它们主要源于这样一个事实:responser是深层嵌套的,而你只是试图在顶层迭代它。您需要进行一些额外的处理才能查看您正在寻找的目标事件。

一种方法可能是编写一堆嵌套循环。我不太了解您的数据,无法猜测每个嵌套级别的含义,但您可以执行以下操作:

from collections import defaultdict

# do html request and json parsing to get `responser`

results = defaultdict(int)
for match in responser: 
    for num_events, team, events in match:
         for x in events: # no idea what this level means
             for y in x: # nor this one
                 for event_type, play_type, body_part, something_else in y:
                     if event_type == "goal" and play_type == "openplay":
                         results[event_type, play_type] += 1

您可以根据需要使用中间循环中的值(例如,以某种方式在数据中包含团队名称)。我们不清楚您所需输出中的数字究竟是什么意思,因此我无法提供准确的代码。