【问题标题】:Incrementally adding 1 to two different values per key in a dictionary将字典中的每个键递增地添加 1 到两个不同的值
【发布时间】:2021-10-27 23:01:52
【问题描述】:

编辑:在底部添加示例代码

我正在使用字典来跟踪给定键的两个值。例如,我想跟踪几个棒球运动员的球数和击球数。所以我有两个棒球运动员:

  1. 蒂姆
  2. 马克

所有统计数据都列在一个文本文件中,例如:

  • 蒂姆罢工
  • 蒂姆得到球
  • 蒂姆罢工
  • 马克得到球

等等等等。所以对于第一行,字典会这样(反映蒂姆罢工)。

stats = {'tim', [1, 0]}

然后他得到一个球:

stats = {'tim', [1, 1]}

然后又是一次罢工:

stats = {'tim', [2, 1]}

然后马克得到一个球:

stat = {'tim', [2, 1],
       'mark', [0, 1]}

开始通过创建两个字典(一个用于罢工,一个用于球)来解决这个问题,但我遇到了两个问题:

  1. 当我尝试将来自罢工的价值附加到一名球员的球时,我遇到了错误:

    TypeError: 'int' object is not iterable

我假设这意味着 append() 不适用于整数,但我不确定。我也尝试使用 str() 更改值,但遇到了同样的错误。

  1. 即使我能解决这个问题,我也需要在没有记录好击球或球时输入 0。

这是我目前拥有的通用代码:

#!/usr/bin/env python3

import re

strike = {}
ball = {}

with open("baseball_stats.txt", "r") as file:
    for line in file:
        player = re.search(r"^\s*([a-zA-Z]+)", line)
        name = player.group(1)
        if "strike" in line:
            if name in strike:
                strike[name] += 1
            else:
                strike[name] = 1
        else:
            if name in ball:
                ball[name] += 1
            else:
                ball[name] = 1

## This is where I tried to combine the tow into the Strike dictionary and add 0's when no strikes where recorded

for key, value in ball.items():
   if key in strike.keys():
       addBall = ball[key]
       strike[key].append(addBall)
   else:
       strike[key] = 0
       addBall = ball[key]
       strike[key].append(addBall)

基本上,我认为这一切都错了,我想寻求指导。让我知道是否需要详细说明。有什么帮助!

【问题讨论】:

  • 向我们展示您的代码。如果名称不存在,则需要将其设置为 [0.0] 才能启动。你永远不想附加值。你总是有两个整数。
  • 字典似乎是解决这个问题的不好方法。我建议熊猫。如果可以的话,可以尝试把一些东西放在一起。
  • 欢迎来到 Stack Overflow。请阅读meta.stackoverflow.com/questions/359146/…。您对错误消息的描述不足以debug 问题。 阅读理解错误消息对于您自己的努力很重要 (since you are supposed to try first),只有您向我们提供该信息,我们才能采取行动。
  • 您还应该首先尝试用简单的英语逐步描述您的代码的预期逻辑。你可能会发现拿一支真正的铅笔和一张纸,然后画一个流程图很有帮助。但是考虑一下:如果您尝试直接构建字典怎么办?假设您遇到Tim gets a strike。假设Tim 不在字典中;为了反映罢工,应该在字典中加入什么? (提示:他现在有多少个好球?他现在有多少个球?)如果他已经在字典里,值会是什么样子?你应该如何改变它?

标签: python python-3.x dictionary


【解决方案1】:

如果您打算以后为每位玩家保留更多统计数据,嵌套字典可能是最好的选择。 defaultdict 类(来自集合)将使其易于使用。

输入:

events = ["Jim ball",
          "Jim strike",
          "Jim strike",
          "Jim ball",
          "Jim strike out",
          "Tom ball",
          "Tom hit out",
          "Mark strike",
          "Mark ball",
          "Mark hit onBase" ]

流程:

from collections import defaultdict
players = defaultdict(lambda:defaultdict(int))
for event in events:
    player,*keywords = event.split()
    for stat in keywords:
        players[player][stat] += 1

输出:

print(players)

defaultdict(<function <lambda> at 0x7fc0f9996400>, 
{'Jim': defaultdict(<class 'int'>, 
        {'ball': 2, 'strike': 3, 'out': 1}), 
 'Tom': defaultdict(<class 'int'>, 
        {'ball': 1, 'hit': 1, 'out': 1}), 
'Mark': defaultdict(<class 'int'>, 
        {'strike': 1, 'ball': 1, 'hit': 1, 'onBase': 1})
})

print(players['Jim']['ball']) # 2
print(sum(stats['strike'] for stats in players.values())) # 4 
print(max(players,key=lambda p:players[p]['ball'])) # Jim

【讨论】:

    【解决方案2】:

    这是我对您的问题的简单解决方案(是的,您应该发布您的代码,以便人们可以尝试提供帮助!):

    events = [["Tim", "strike"],
    ["Tim", "ball"],
    ["Tim" , "strike"],
    ["Mark", "ball"]]
    
    res = {}
    for e in events:
        player = res.get(e[0], [0, 0])
        if e[1] == "strike":
            player[0] += 1
        elif e[1] == "ball":
            player[1] += 1
        res[e[0]] = player
    
     print(res)
    

    【讨论】:

    • 这很有帮助,谢谢 nikeros!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 2010-12-02
    相关资源
    最近更新 更多