首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Json上为循环列出超出范围的索引

在Json上为循环列出超出范围的索引
EN

Stack Overflow用户
提问于 2019-01-17 12:31:28
回答 2查看 1.6K关注 0票数 1

我试图请求一个json对象并使用for循环在对象中运行,并取出我需要的数据并将其保存到django中的一个模型中。

我只想要runner_1_namerunner_2_name的前两个属性,但是在json对象中,每个列表中的数量或运行程序不同。我一直在让列表索引超出范围误差。我尝试过使用“尝试并接受”,但是当我尝试保存到模型时,它显示了在赋值之前引用了我的保存变量,那么忽略列表、索引输出或范围错误或修正列表的最佳方式是什么,以便索引是正确的?我还希望代码运行得非常快,因为我将使用这个函数作为后台任务,每两秒钟轮询一次。

代码语言:javascript
复制
@shared_task()
def mb_get_events():
mb = APIClient('username' , 'pass')
tennis_events = mb.market_data.get_events()

for data in tennis_events:
id = data['id']
event_name = data['name']

sport_id = data['sport-id']
start_time = data['start']
is_ip = data['in-running-flag']

par = data['event-participants']
event_id = par[0]['event-id']

cat_id = data['meta-tags'][0]['id']
cat_name = data['meta-tags'][0]['name']
cat_type = data['meta-tags'][0]['type']
url_name = data['meta-tags'][0]['type']

try:
    runner_1_name = data['markets'][0]['runners'][0]['name']
except IndexError:
      pass
 try: 
    runner_2_name = data['markets'][0]['runners'][1]['name']
 except IndexError:
      pass

run1_par_id = data['markets'][0]['runners'][0]['id']
run2_par_id = data['markets'][0]['runners'][1]['id']

run1_back_odds = data['markets'][0]['runners'][0]['prices'][0]['odds'] 
run2_back_odds = data['markets'][0]['runners'][1]['prices'][0]['odds'] 
run1_lay_odds = data['markets'][0]['runners'][0]['prices'][3]['odds'] 
run2_lay_odds = data['markets'][0]['runners'][1]['prices'][3]['odds'] 

te, created = MBEvent.objects.update_or_create(id=id)
te.id = id
te.event_name = event_name
te.sport_id = sport_id
te.start_time = start_time
te.is_ip = is_ip
te.event_id = event_id
te.runner_1_name = runner_1_name
te.runner_2_name = runner_2_name
te.run1_back_odds = run1_back_odds
te.run2_back_odds = run2_back_odds
te.run1_lay_odds = run1_lay_odds
te.run2_lay_odds = run2_lay_odds
te.run1_par_id = run1_par_id
te.run2_par_id = run2_par_id
te.cat_id = cat_id
te.cat_name = cat_name
te.cat_type = cat_type
te.url_name = url_name
te.save()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-17 13:14:06

快速修复:

代码语言:javascript
复制
try:
    runner_1_name = data['markets'][0]['runners'][0]['name']
except IndexError:
    runner_1_name = ''  # don't just pass here
try: 
    runner_2_name = data['markets'][0]['runners'][1]['name']
except IndexError:
  runner_2_name = ''

它为您提供了variables is referenced before assignment,因为在expect块中,您只是在传递,所以如果尝试失败,runner_1_namerunner_2_name永远不会被定义。当您尝试使用这些变量时,会得到一个错误,因为它们从未被定义过。因此,在set块中,要么将值设置为空字符串,要么将其他字符串设置为'Runner Does not Exists'

现在,如果您想完全避免尝试/除和IndexError,可以使用if语句来检查marketsrunners的长度。就像这样:

代码语言:javascript
复制
runner_1_name = ''
runner_2_name = ''
# Make sure markets exists in data and its length is greater than 0 and runners exists in first market
if 'markets' in data and len(data['markets']) > 0 and 'runners' in data['market'][0]:
    runners = data['markets'][0]['runners']
    # get runner 1
    if len(runners) > 0 and `name` in runners[0]:
        runner_1_name = runners[0]['name']
    else:
        runner_1_name = 'Runner 1 does not exists'
    # get runner 2
    if len(runners) > 1 and `name` in runners[1]:
        runner_2_name = runners[1]['name']
    else:
        runner_2_name = 'Runner 2 does not exists'

正如你所看到的,这样的时间太长了,这并不是做事情的推荐方法。

您应该假设数据是正常的,并尝试获取名称并使用try /除捕获前面第一个代码片段中建议的任何错误之外。

票数 1
EN

Stack Overflow用户

发布于 2019-12-11 09:19:53

我有一个评论列表的问题,这些评论可以是空的,也可以是由数量未知的评论填充的。

我的解决方案是在0处初始化一个计数变量,并在循环中的一个布尔值上有一个while循环,如果它失败了,我尝试得到注释计数,除了IndexError,我将布尔值设置为False以停止无限循环。

代码语言:javascript
复制
count = 0
condition_continue = True

while condition_continue :
    try:
        detailsCommentDict = comments[count]
        ....
    except IndexError:
        # no comment at all or no more comment
        condition_continue = False  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54236043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档