Python:如果 OrderedDict 中不存在任何值,如何删除具有特定键的元素



如果特定键具有特殊值"none",我需要删除 OrderedDict 输出中的元素。我需要 如果 Data2 和 Data3 都包含 None 作为条目,将删除元素。

    # if both Data2 and Data3 is None
    Key_to_check = [Data2,Data3]
    Output=[OrderedDict([('index', 78), ('Name', u'Andy'), ('Data1', u'Taken'), ('Data2', u'Taken'),('Data3', u'Taken'),
OrderedDict([('index', 609), ('Name', u'Sam'), ('Data1', u'Taken'), ('Data2', None),('Data3', u'Taken'),
OrderedDict([('index', 680), ('Name', u'John'), ('Data1', u'Taken'), ('Data2', None),('Data3', None)]

由于 John 有数据 2 和数据 3 是 None,因此将删除它。如何让输出删除它?

Output=[OrderedDict([('index', 78), ('Name', u'Andy'), ('Data1', u'Taken'), ('Data2', u'Taken'),('Data3', u'Taken'),
    OrderedDict([('index', 609), ('Name', u'Sam'), ('Data1', u'Taken'), ('Data2', None),('Data3', u'Taken')]
您可以使用

此列表理解:

>>> from collections import OrderedDict
>>>
>>> Output=[OrderedDict([('index', 78), ('Name', u'Andy'), ('Data1', u'Taken'), ('Data2', u'Taken'),('Data3', u'Taken')]),OrderedDict([('index', 609), ('Name', u'Sam'), ('Data1', u'Taken'), ('Data2', None),('Data3', u'Taken')]),OrderedDict([('index', 680), ('Name', u'John'), ('Data1', u'Taken'), ('Data2', None),('Data3', None)])]
>>>
>>> [i for i in Output if i["Data2"] or i["Data3"]]
[OrderedDict([('index', 78), ('Name', u'Andy'), ('Data1', u'Taken'), ('Data2', u'Taken'), ('Data3', u'Taken')]), OrderedDict([('index', 609), ('Name', u'Sam'), ('Data1', u'Taken'), ('Data2', None), ('Data3', u'Taken')])

另一种方式,您可以使用内置函数any如下所示:

>>> [i for i in Output if any(i.get("Data{0}".format(j),None) for j in range(2,4))]
[OrderedDict([('index', 78), ('Name', u'Andy'), ('Data1', u'Taken'), ('Data2', u'Taken'), ('Data3', u'Taken')]), OrderedDict([('index', 609), ('Name', u'Sam'), ('Data1', u'Taken'), ('Data2', None), ('Data3', u'Taken')])]

如果您有数据2,数据3...数据 100,将range(2,4)更改为 range(2,101)

任意(可迭代(

如果可迭代对象的任何元素为 true,则返回 True。如果可迭代对象是 空,返回 False。

让我们试试:

temp= {k:v for k,v in Data2.items() if (v is not None) or (Data3.get(k, 'Not Existed') is not None)}
Data3 = {k:v for k,v in Data3.items() if (v is not None) or (Data2.get(k, 'Not Existed') is not None)}
Data2 = temp

或更短的版本:

Data2, Data3 = {k:v for k,v in Data2.items() if (v is not None) or (Data3.get(k, 'Not Existed') is not None)}, {k:v for k,v in Data3.items() if (v is not None) or (Data2.get(k, 'Not Existed') is not None)}

最新更新