【问题标题】:Loop not iterating correctly when using a dictionary使用字典时循环未正确迭代
【发布时间】:2020-04-07 07:37:16
【问题描述】:

循环的目标是当字典中的键(字典在代码中为 WorldSeriesWins)等于名为 Team 的列表中的 t 时,将字典的值加 1。它似乎没有正确迭代,因为我相信我编码错误。

这是我认为不正确的代码部分:

WorldSeriesWins = {}
for t in Team:
   WorldSeriesWins[t] = 1
   if t == WorldSeriesWins.keys():
        WorldSeriesWins[t] +=1
   else:
       WorldSeriesWins[t] = 1

结果:

 {'Boston Americans': 1, 'New York Giants': 1, 'Chicago White Sox': 1, 'Chicago Cubs': 1, 'Pittsburgh Pirates': 1, 'Philadelphia Athletics': 1, 'Boston Red Sox': 1, 'Boston Braves': 1, 'Cincinnati Reds': 1, 'Cleveland Indians': 1, 'New York Yankees': 1, 'Washington Senators': 1, 'St. Louis Cardinals': 1, 'Detroit Tigers': 1, 'Brooklyn Dodgers': 1, 'Milwaukee Braves': 1, 'Los Angeles Dodgers': 1, 'Baltimore Orioles': 1, 'New York Mets': 1, 'Oakland Athletics': 1, 'Philadelphia Phillies': 1, 'Kansas City Royals': 1, 'Minnesota Twins': 1, 'Toronto Blue Jays': 1, 'Atlanta Braves': 1, 'Florida Marlins': 1, 'Arizona Diamondbacks': 1, 'Anaheim Angels': 1}

这意味着没有任何重复,但肯定是基于列表的。我不是 100% 确定我在这里做错了什么。有人可以帮助我吗?

【问题讨论】:

  • 每次看到t 时都会将其重置为1,因为WorldSeriesWins[t] = 1 在循环内。
  • 我同意@MarkMeyer。我认为你应该删除第 3 行。我还认为你的 if 永远不会是 true 所以你总是在你的 else 案例中。我认为您需要类似 if t in WorldSeriesWins.keys(): 的东西。
  • 这解决了它,谢谢!那么,list() 从 WorldSeriesWins 字典中创建一个可迭代的键列表?还是我误会了?再次感谢您的帮助!
  • @QMan5 一开始我把它弄得太复杂了,但在我的机器上测试并改进了第一条评论。没有必要像我最初想的那样将它包装在list(...) 中,因为keys() 的输出已经是可迭代的。关键更改是您要检查in 条件而不是== 条件。您的 t str 不会是 ==WorldSeriesWins.keys() 的输出,因为该方法不会返回 str
  • 使用from collections import Counter; WorldSeriesWins = Counter(Team)可能会简单很多

标签: python list dictionary for-loop


【解决方案1】:

这是由集合库中的Counter 类完成的:

from collections import Counter

c = Counter(Team)
WorldSeriesWins = dict(c)

或单班轮WorldSeriesWins = dict(Counter(Team))

【讨论】:

    【解决方案2】:
    WorldSeriesWins = {}
    for t in Team:
       # WorldSeriesWins[t] = 1
       if t in WorldSeriesWins.keys():
            WorldSeriesWins[t] +=1
       else:
           WorldSeriesWins[t] = 1
    

    t == World...: 更改为t in World...:

    另外,第一个 WorldSeriesWins[t] = 1 会不断重置您的计数。

    【讨论】:

      【解决方案3】:

      您总是将球队的获胜次数重置为 1。只需省略第三行即可。

      此外,要检查团队是否已经在字典中,请使用 in,而不是 ==

      最后,使用a in dict 代替a in dict.keys() 就足够了(而且更有效),有关详细信息,请参阅this SO answer

      WorldSeriesWins = {}
      for t in Team:
         if t in WorldSeriesWins:
              WorldSeriesWins[t] +=1
         else:
             WorldSeriesWins[t] = 1
      

      另外,使用 Python 标准库中的 collections.defaultdict 可能更具可读性:

      import collections
      WorldSeriesWins = collections.defaultdict(int) # call int() (--> 0) to create unknown values
      for t in Team:
          WorldSeriesWinds[t] += 1
      

      【讨论】:

        猜你喜欢
        • 2012-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多