我有一个缺少值的字典(键在那里,但关联的值为空(。例如,我想要下面的字典:
dct = {'ID':'', 'gender':'male', 'age':'20', 'weight':'', 'height':'5.7'}
要更改为此形式:
dct = {'ID':NaN, 'gender':'male', 'age':'20', 'weight':NaN, 'height':'5.7'}
我怎样才能以最省时的方式编写它?
您可以使用字典理解。 同样如评论中所述,在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
Python 3.5+ 的math.nan
使用numpy
numpy.nan
您可以将隐式语法与布尔or
表达式一起使用:
In [1]: dct = {'ID':'', 'gender':'male', 'age':'20', 'weight':'', 'height':'5.7'}
In [2]: {k: v or None for k, v in dct.items()}
Out[2]: {'ID': None, 'age': '20', 'gender': 'male', 'height': '5.7', 'weight': None}
但请注意,在 The Zen of Python 中说:
显式总比隐式好。
你可以创建一个类对象来表示NaN
:
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'}
for 循环遍历字典中的所有键和值。
dct = {'ID': '', 'gender': 'male', 'age': '20', 'weight': '', 'height': '5.7'}
for key, value in dct.items():
if value == '':
dct[key] = 'NaN'
print(dct)
- 您使用一系列键值对创建了字典。
- 我使用 for 循环和 .items(( 方法来迭代字典中的每个键值对。
- 如果键/值对的值为空字符串,我们将该特定值更改为"NaN",其余值保持不变。
当我们打印新字典时,我们得到以下输出:
{'ID': 'NaN', 'gender': 'male', 'age': '20', 'weight': 'NaN', 'height': '5.7'}
这是节省时间的,因为它是一个快速循环,只要你同意不是"NaN"值是字符串。我不确定您是否正在寻找字符串,但是,如果您正在寻找,您可以非常简单地将值从"NaN"更改为 None。for 循环在时间方面相对有效,因为它将快速迭代每个值。