我有以下代码用于返回嵌套的列表集:
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
...我不知道如何解决。任何人都可以为我建议一种语法,将我的源数据转换为我想要的最终输出吗?
由于
答案 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
您可以根据需要使用中间循环中的值(例如,以某种方式在数据中包含团队名称)。我们不清楚您所需输出中的数字究竟是什么意思,因此我无法提供准确的代码。