【问题标题】:Python: How to have a user reference and access a variable? [duplicate]Python:如何获得用户引用和访问变量? [复制]
【发布时间】:2015-02-26 08:19:24
【问题描述】:

我正在编写一个程序来跟踪棒球队的收视率。我希望用户能够输入参加过的球队的名称缩写,每个球队的得分,并让程序相应地更新他们的评级。

我将每个团队列在一个名为 teams 的列表中,并为每个团队创建一个新的按时间顺序排列的列表,初始评分为 1500:

teams = ["ARI","ATL","BAL","BOS","CHC","CWS","CIN","CLE","COL","DET",
"HOU","KC","LAA","LAD","MIA","MIL","MIN","NYM","NYY","OAK",
"PHI","PIT","SD","SEA","SF","STL","TB","TEX","TOR","WSH"]

for team in teams:
    team = [1500]

因此,每个团队缩写现在都有一个初始值为 [1500] 的关联列表,每个新评级都将附加该列表。在该声明之外,我尝试让用户参考他们希望将新评级附加到哪个团队列表(在程序计算差异之后):

def gameIn(at="None", ht="None"):
    while at.upper() not in teams:
        at = input("Enter away team abbreviation: ")
        at = at.upper()
        if at not in teams:
            print("Team selection invalid, try again")
    while True:
        try:
            atr = int(input("Runs: "))
        except ValueError:
            print('Error: improper score.')
            continue
        break
    while ht.upper() not in teams:
        ht = input("Enter home team abbreviation: ")
        ht = ht.upper()
        if ht not in teams:
            print("Team selection invalid, try again")
        elif at == ht:
            print("Home team and away team cannot be the same, try again")
    while True:
        try:
            htr = int(input("Runs: "))
        except ValueError:
            print('Error: improper score.')
            continue
        break
    htOldRating = ht[-1]
    atOldRating = at[-1]
    print(htOldRating)
    print(atOldRating)  

最后两个语句将简单地打印每个团队名称中的最后一个字母,这意味着该函数不会访问团队的全局列表和团队评级列表,并且正在声明字符串类型的新局部变量。是否可以让用户输入他们想要访问的列表变量名并让程序识别它?

【问题讨论】:

  • for team in teams: team = [1500]创建关联。它只是一遍又一遍地重新绑定team,直到你最终在你的命名空间中得到team = [1500=。也许您想在那里使用字典
  • 我最初使用字典,直到我意识到我需要每个团队都有一个不断更新的列表而不是单个值。这不是问题,但是,我仔细检查并手动为每个团队分配了自己的列表;即 30 个 ARI = [1500] 类型语句来尝试解决我的问题。这没有帮助。
  • @AndrewSzoke:不,Antti 的链接帖子解释了如何做到这一点。我在下面的回答中使用了这种技术。字典可以映射到任何类型的 Python 对象,而不仅仅是数字,您也可以在那里使用列表。

标签: python list python-3.4


【解决方案1】:

循环

for team in teams:
    team = [1500]

每次只需将变量team 设置为[1500]。它不创建任何关联。 team 首先绑定到 teams 中的一个字符串,然后重复绑定到列表对象。

您需要在此处创建一个字典,以便将团队名称映射到评分:

ratings = {}
for team in teams:
    ratings[team] = [1500]

或者简单地说:

ratings = {team: [1500] for team in teams}

之后,您可以按主队和客队名称在您的职能中访问这些评级列表:

htOldRating = ratings[ht][-1]
atOldRating = ratings[at][-1]
print(htOldRating)
print(atOldRating)  

【讨论】:

  • 让它工作,非常感谢。如果我试图将其保留为 30 个单独维护的列表,我将如何初始化它们?我对该主题的另一篇 SE 帖子的语法相当有信心。
  • 实际上你不会。您可以尝试使用 globals() 字典,但要维护和避免仅使用专用字典进行此映射时会出现问题。
猜你喜欢
  • 2013-02-04
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2016-11-06
  • 2013-02-06
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
相关资源
最近更新 更多