【问题标题】:Update type of value in dictionary within list更新列表中字典中的值类型
【发布时间】:2020-09-06 13:29:52
【问题描述】:

有人能告诉我这个吗?:

我有一个字典列表:

[{'overall': 5.0,
  'vote': 'overall',
  'reviewerID': 'AAP7PPBU72QFM'},
 {'overall': 3.0,
  'vote': '5',
  'reviewerID': 'A2E168DTVGE6SV'},
...]

如何将“整体”和“投票”项目转换为整数,同时将所有非有效数字设置为 0?

为了更清楚,所需的输出是:

[{'overall': 5,
  'vote': 0,
  'reviewerID': 'AAP7PPBU72QFM'},
 {'overall': 3,
  'vote': 5,
  'reviewerID': 'A2E168DTVGE6SV'},
...]

非常感谢。

【问题讨论】:

    标签: python dictionary type-conversion


    【解决方案1】:

    另一个解决方案很棒,这是另一个可读性解决方案:

    list_dicts = [{'overall': 5.0,
      'vote': 'overall',
      'reviewerID': 'AAP7PPBU72QFM'},
     {'overall': 3.0,
      'vote': '5',
      'reviewerID': 'A2E168DTVGE6SV'}]
    
    def fix_key(d, k):
        try:
            d[k] = int(d[k])
        except:
            d[k] = 0
    
    def fix(d):
        fix_key(d, 'vote')
        fix_key(d, 'overall')
        return d
    
    list_dicts = [fix(d) for d in list_dicts]
    
    # [{'overall': 5, 'vote': 0, 'reviewerID': 'AAP7PPBU72QFM'}, {'overall': 3, 'vote': 5, 'reviewerID': 'A2E168DTVGE6SV'}]
    print(list_dicts)
    

    【讨论】:

    • +1 这是一个更有效的解决方案。只是一个你可能应该except ValueError 的挑剔,而不是一切,以便你可以捕获其他错误。另一个错误的示例可能是如果其中一个字典不包含 'vote''overall' 之一,在这种情况下,KeyError 将被抛出并捕获,这对最终用户来说是不可取的。
    • 是的,我不断收到 KeyError: 'vote' 的代码。
    • @LuisMagalhaes 改回原来的代码,现在试试。正如上面之前的评论一样,我之前已更新为不会捕获缺少“投票”键时引发的异常。
    【解决方案2】:
    def clean_value(x):
        try:
            return int(x)
        except ValueError:
            return 0
    
    def clean_list_of_dicts(l):
        return [{
            k:v if k not in ('overall', 'vote') else clean_value(v) \
            for k, v in d.items()
        } for d in l]
    

    使用您的输入数据进行的测试表明该解决方案有效。

    >>> clean_list_of_dicts([{'overall': 5.0,
      'vote': 'overall',
      'reviewerID': 'AAP7PPBU72QFM'},
     {'overall': 3.0,
      'vote': '5',
      'reviewerID': 'A2E168DTVGE6SV'}
    ])
    

    给出输出:

    [{'overall': 5,
      'vote': 0,
      'reviewerID': 'AAP7PPBU72QFM'},
     {'overall': 3,
      'vote': 5,
      'reviewerID': 'A2E168DTVGE6SV'}]
    

    【讨论】:

    • 我不确定发生了什么...它工作了几次,但大多数时候它什么也没做...
    【解决方案3】:

    我希望它对你有用,但与函数一起使用会更好

    for i in data:
      i['overall'] =int(i['overall'])
      i['vote'] = int(i['vote']) if (i['vote']).isdigit() else 0
    

    【讨论】:

    • 我希望这两条短线能够正常工作(它们更适合我的项目风格),但我有 KeyError: 'vote' 。我相信这里确实需要 try 和 except
    • 我认为这是因为您的投票拼写不同,例如“投票”等可能像这样工作 ` i['vote] = (i['vote'].lower() ` 或也许正如你所说,使用 try carch 可以解决
    • 这是因为有时根本没有“投票”键。抱歉,这不在问题中,我只是在尝试答案时发现了这一点。
    猜你喜欢
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多