首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中为循环嵌套,未定义变量。

在python中为循环嵌套,未定义变量。
EN

Stack Overflow用户
提问于 2015-08-03 19:59:07
回答 3查看 3.1K关注 0票数 0

所以我在Python中有两个列表。两者都是列表。当我单独打印行时,它们看起来像这样(除了大得多):

PROBABLES

代码语言:javascript
复制
['Name10', 'Ari']
['Name11', 'Atl']
['Name12', 'Bal']
['Name13', 'Bos']
['Name14', 'ChC/CWS']
['Name15', 'Cin']
['Name15', 'Cle']
['Name16', 'Col']
['Name17', 'ChC/CWS']
['Name18', 'Det']

工资

代码语言:javascript
复制
['SP', 'Name1', '6900', 'Tor', '@', 'Sea']
['SP', 'Name2', '6900', 'Hou', '@', 'KC']
['SP', 'Name3', '6900', 'LAD', '@' 'NYM']
['SP', 'Name4', '6800', 'ChC', '@', 'Phi']

问题是,对于Probables列表中的第二个值,有时它们会有两样东西。参见上面的例子,带有斜杠的例子。我想要做的是用正确的值替换这个值(基本上选择正确的值)。我认为最好的方法就是与第二个列表进行比较。

例如,最后,Probables中的第5行将读为“Name14”,“ChC”,如果Name14在Probables中与Name4的工资相同。这是我目前掌握的密码。

代码语言:javascript
复制
for row in probables:
    if '/' in row[1]:
        a = row[0] #Name from probables list
        b = row[1] #Abbrev. of team
        for row in salaries:
            if row[1] == a:
                c = row[3] #First team involved in game
                d = row[5] #Second team involved in game
    if b == c:
        row[1] = c
    elif b == d:
        row[1] = d

这给了我错误的“回溯”(最近一次调用):文件“c:\ == \Owner\Desktop\Test\matching test.py",第21行,如果b==c: NameError: name 'b‘是未定义的”

我假设这与变量的工作方式以及在循环内部的定义有关,但我不知道如何修复它。有什么帮助吗?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-03 20:37:36

其他解决方案回答了您的问题(当if '/' ...计算为false时没有分配变量),但是代码仍然存在问题。在第二个循环中,您要重用相同的变量名。在此if语句之后,row将始终设置为“薪资”中的最后一行。

我猜这不是你想要的。您至少应该使用另一个变量。一旦找到匹配项,您可能还想要跳出第二个for循环,这样就不会不必要地遍历整个列表。你可以使用中断

代码语言:javascript
复制
for row in probables:
    if '/' in row[1]:
        a = row[0] #Name from probables list
        b = row[1] #Abbrev. of team
        for salary in salaries:
            if salary[1] == a:
                c = salary[3] #First team involved in game
                d = salary[5] #Second team involved in game
                break         # Stop looping through salaries
        if b == c:
            row[1] = c
        elif b == d:
            row[1] = d

另一个问题是,在您第一次输入if '/' ...语句之后,c和d将被设置,如果薪资列表中没有匹配,您可以(取决于您的数据)假设您在没有找到什么东西的情况下。为了避免这种情况,我会将if / set语句移到循环中,或者添加另一个变量found。或者两者都有。

代码语言:javascript
复制
for row in probables:
    if '/' in row[1]:
        a = row[0] #Name from probables list
        b = row[1] #Abbrev. of team
        found = False
        for salary in salaries:
            if salary[1] == a:
                c = salary[3] #First team involved in game
                d = salary[5] #Second team involved in game
                if b == c:
                    row[1] = c
                elif b == d:
                    row[1] = d
                found = True
                break
        if not found:
            print "Can't find team for row"
            print row
            break
票数 1
EN

Stack Overflow用户

发布于 2015-08-03 20:12:42

正如注释已经指出的,这是因为您在row1:‘循环中的'if '/’中定义了a、b、c和d,但是大多数条目从未进入该循环。例如,对于probables中的第1行,只有当'/‘在row1中时,才告诉它进入第一个循环。所以它不会进入那个循环。然后告诉它比较b到c,b和c还没有定义,所以它出错了。因为这些行无论如何都不需要修改,所以它们应该完全跳过。您可以再次缩进其他循环,将它们都置于row1中的“if”逻辑之下。

代码语言:javascript
复制
for row in probables:
    if '/' in row[1]:
        a = row[0] #Name from probables list
        b = row[1] #Abbrev. of team
        for row in salaries:
            if row[1] == a:
                c = row[3] #First team involved in game
                d = row[5] #Second team involved in game
        if b == c:
            row[1] = c
        elif b == d:
            row[1] = d
票数 1
EN

Stack Overflow用户

发布于 2015-08-03 20:11:27

这是因为b和c是row1:中"if‘/“语句中的局部变量。因此,当进入第二个if语句时,它不知道b和c是什么,除非它是全局定义的。所以,确保在第二个if语句之前重新定义b和c。

代码语言:javascript
复制
for row in probables:
# define b and c variables here
    if '/' in row[1]:
        a = row[0] #Name from probables list
        b = row[1] #Abbrev. of team
        for row in salaries:
            if row[1] == a:
                c = row[3] #First team involved in game
                d = row[5] #Second team involved in game
    if b == c:
        row[1] = c
    elif b == d:
        row[1] = d
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31795754

复制
相关文章

相似问题

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