【问题标题】:Updating dictionary values of keys from a .txt file从 .txt 文件更新键的字典值
【发布时间】:2017-04-02 10:29:52
【问题描述】:

所以我从 txt 文件“PM.txt”中创建了一个字典,其中键是球员,值是他们的罚时。我知道字典键必须是唯一的,所以我将如何更新键的值并将其添加到当前值,因为键在 txt 文件中存在不止一次。

    "PM.txt"
    Neil,2
    Paul,5
    Neil,10
    Santos,2
    Neil,2
    Santos,10
    Paul,2
    Alex,2

到目前为止,我有这个返回:

{“亚历克斯”:2,“桑托斯”:10,“保罗”:2,“尼尔”:2}

    def pm_dict(filename):
        f = open(filename, 'r')
        dict = {}
        for line in f:
            x = line.split(",")
            player = x[0]
            minutes = x[1]
            c = len(minutes)-2
            minutes = minutes[0:c]
            dict[player] = minutes

        return dict

但是我将如何创建一个函数或一个助手让它返回:

{“亚历克斯”:2,“桑托斯”:12,“保罗”:7,“尼尔”:14}

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    几个标准库使这个问题变得简单明了。如果 defaultdict 不存在其默认类型的密钥,则它会创建一个密钥,因此即使该密钥尚不存在,您也可以使用 D[key] += valuecsv 模块自动解析 .csv 文件。默认分隔符是逗号。还要确保不要使用dict 作为变量名。它会覆盖dict 类型。

    from collections import defaultdict
    import csv
    
    def pm_dict(filename):
        D = defaultdict(int)
        with open(filename, 'r', newline='') as f:
            r = csv.reader(f)
            for key,value in r:
                D[key] += int(value)
        return dict(D) # converts back to a standard dict, but not required.
    
    print(pm_dict('PM.txt'))
    

    输出:

    {'Neil': 14, 'Paul': 7, 'Alex': 2, 'Santos': 12}
    

    这些值作为数字更有意义,但如果您想要像示例中那样的值字符串,则函数的最后一行可以如下将值转换回字符串。这是一个字典理解

    return {k:str(v) for k,v in D.items()}
    

    【讨论】:

      【解决方案2】:

      首先将您的minute 转换为int

      minutes = int(x[1])
      

      然后将其添加到字典中:

      if player in dict:
        dict[player] += minutes
      else:
        dict[player] = minutes
      

      【讨论】:

        【解决方案3】:

        在你的 for 循环中,而不是 dict[player] = minutes:

        if player not in dict:
            dict[player] = 0
        
        dict[player] += minutes
        

        还有,而不是:

                minutes = x[1]
                c = len(minutes)-2
                minutes = minutes[0:c]
        

        你可以这样做:

        minutes = x[1].strip()
        

        【讨论】:

          【解决方案4】:

          只需使用defaultdict:

          def pm_dict(filename):
              f = open(filename, 'r')
              dict = defaultdict(int)
              for line in f:
                  x = line.split(",")
                  player = x[0]
                  minutes = x[1]
                  c = len(minutes)-2
                  minutes = minutes[0:c]
                  dict[player] += int(minutes)
          
              return dict
          

          重构后:

          import csv
          from collections import defaultdict
          

          ...

          def get_penalty_minutes_dict(filename):
              result_dict = defaultdict(int)
              with open(filename, 'r') as f:           
                 for player, minutes in csv.reader(f):
                     result_dict[player] += int(minutes)
          
              return result_dict
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-07-28
            • 2021-07-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-01
            • 1970-01-01
            • 2019-11-18
            相关资源
            最近更新 更多