在Python中处理可选值的最佳方法是什么?

时间:2019-02-10 01:20:07

标签: python python-3.6

我有一个数据结构,在该结构下,我可以用来跟踪视频游戏中的某些数据。

values = {
    'kills': None,
    'assists': None,
    'deaths': None,
    'minutes': None,
    'seconds': None,
}

根据可用的数据,我在进行过程中填写values。但是,所有属性都是可选的,并且可以为None。例如kills可以是12None。这一切都取决于我当时可用的数据。我可以通过有一个对象来存储数据来使它更好一些,但仍然会遇到这些可选值的问题。

在Python中处理此类可选内容的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

您的直觉是正确的。无需存储所有可能的选项。只需存储适用的内容即可。

解决方案1:使用get()代替存储Nones

通常,我们不会在字典中存储所有可能的 None 值。只需填写非None值,然后使用dict.get()方法获取值即可:

>>> options = {'weapon': 'dagger'}
>>> print(options.get('weapon'))
dagger
>>> print(options.get('food'))
None

解决方案2:数字数据计数器默认为零

如果所有值都是数字,请考虑使用collections.Counter(),该选项可使可选条目默认为零:

>>> from collections import Counter
>>> options = Counter(kills=4, deaths=2)
>>> options['kills']
4
>>> options['deaths'] += 1
>>> options['deaths']
3
>>> options['assists']
0

解决方案3:在实例或类中获取可选数据的getattr()

通过getattr()函数,您可以在使用实例或类时为属性查找提供特定的默认值。实例方法对于跟踪每个玩家的数据特别有用:

>>> anka = Player()
>>> vlad = Player()
>>> anka.hits = 5
>>> vlad.assists = 2
>>> print(getattr(anka, 'hits', None))
5
>>> print(getattr(vlad, 'hits', None))
None

解决方案4:对于已知的默认设置,请使用ChainMap

通过ChainMap类,您可以将成对的字典链接在一起,以将它们视为单个实体。

>>> from collections import ChainMap
>>> defaults = ChainMap(dict(kills=0, assists=0, location='start', status='alive'))
>>> anka = defaults.new_child()
>>> vlad = defaults.new_child()
>>> anka['hits'] = 5
>>> vlad['assists'] = 2
>>> anka['hits']
5
>>> vlad['location']
'start'

最后一种解决方案使您可以在一个地方组织所有可能的默认值,同时让实例仅存储所需的数据。它还提供了简单的字典访问功能,因此每次查询都不需要 get() getattr()

希望这些解决方案之一非常适合您的问题:-)

答案 1 :(得分:0)

如果您只是根本不想在需要之前初始化键,则可以使用collections包中的defaultdict快速插入新键,而无需初始设置键值对。

from collections import defaultdict

values = defaultdict(int)

values['seconds'] += 1
values['assists'] += 1