我有一个字典,其中一些值是缺失的(键存在,但关联的值为空)。例如,我想要下面这个字典:
dct = {'ID':'', 'gender':'male', 'age':'20', 'weight':'', 'height':'5.7'}
需要更改为以下形式:
dct = {'ID':NaN, 'gender':'male', 'age':'20', 'weight':NaN, 'height':'5.7'}
我该如何以最省时的方式写出来?
我有一个字典,其中一些值是缺失的(键存在,但关联的值为空)。例如,我想要下面这个字典:
dct = {'ID':'', 'gender':'male', 'age':'20', 'weight':'', 'height':'5.7'}
需要更改为以下形式:
dct = {'ID':NaN, 'gender':'male', 'age':'20', 'weight':NaN, 'height':'5.7'}
我该如何以最省时的方式写出来?
你可以使用字典推导式。同时,正如评论中所指出的那样,在Python中将某些变量命名为dict
不是一个好的做法。
你可以使用字典推导式。同时,正如评论中所指出的那样,在Python中将某些变量命名为dict
不是一个好的做法。
dct = {'ID':'', 'gender':'male', 'age':'20', 'weight':'', 'height':'5.7'}
dct = {k: None if not v else v for k, v in dct.items() }
print(dct)
输出:
{'ID': None, 'gender': 'male', 'age': '20', 'weight': None, 'height': '5.7'}
只需将 None
替换为您想要的默认值即可。
在您的问题中,您想用 NaN
替换它。
您可以使用以下任何一种方法:
float('nan')
如果您使用的是 Python 2.x 或 Python <3.5
math.nan
适用于 Python 3.5+
numpy.nan
使用 numpy
NaN
,你应该研究一下 numpy。你需要使用 numpy.nan
。 - user3483203numpy
的 NaN。 - user3483203NaN
,因为它已经集成在math.nan
中了。如果你使用的是早期版本的Python,那么float('nan')
也可以在2.x版本中使用。如果你实际上没有使用numpy,那么你可能不需要它的nan
——它与普通的Python浮点数的兼容性不如内置的nan
。 - abarnertNone
或0
或False
或其他类似的值,则可能不会产生所需的效果。 - trentfor
语句而不是理解)几乎肯定会更快地满足大多数用例。编写一个使用快速字典迭代器 API 的 C 扩展程序将更加快速。我对这种情况下权衡利弊的看法甚至远非值得一提,但他确实说过“最高效的方式”,因此或许有必要发表评论,说明这不是最高效的方式,但这可能是他应该采取的措施。 - abarnertNaN
:class NaN:
def __init__(self, default=None):
self.val = default
def __repr__(self):
return 'NaN'
dct = {'ID':'', 'gender':'male', 'age':'20', 'weight':'', 'height':'5.7'}
new_d = {a:NaN() if not b else b for a, b in dct.items()}
输出:
{'gender': 'male', 'age': '20', 'ID': NaN, 'weight': NaN, 'height': '5.7'}
dct = {'ID': '', 'gender': 'male', 'age': '20', 'weight': '', 'height': '5.7'}
for key, value in dct.items():
if value == '':
dct[key] = 'NaN'
print(dct)
当我们打印新字典时,我们得到以下输出:
{'ID': 'NaN', 'gender': 'male', 'age': '20', 'weight': 'NaN', 'height': '5.7'}
这是时间效率高的,因为它是一个快速循环,只要你不介意'NaN'值被字符串表示。我不确定你是否希望它们成为字符串,但是如果你需要的话,你可以非常简单地将值从'NaN'更改为None。对于循环而言,它在时间上相对高效,因为它会快速迭代每个值。
dct
比构建新的dct
快几个纳秒,或者反之亦然,你会选择更快的那一个,即使它更难读懂或者与你代码的其他部分不太协调吗?如果对于一些大型字典来说更快的方法对于一堆小型字典来说却更慢呢? - abarnertNone
可能比NaN
更合适,特别是因为您没有将该值存储为float
。 - chepnerage
)和浮点数(height
)的值,只使用''
或者一些特殊字符串如'N/A'
可能会更好... - abarnert