2017-05-09 1 views
0

Ich muss ein Element in der Ausgabe von OrderedDict entfernen, wenn ein bestimmter Schlüssel einen speziellen Wert 'none' hat. Ich brauche, wenn Data2 und Data3 wenn None als Eintrag enthält, werden die Elemente entfernt.Python: Wie Elemente mit einem bestimmten Schlüssel entfernt werden, wenn kein Wert existiert in OrderedDict

# 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)] 

Da John Daten 2 und Daten 3 hat, die keine sind, wird es entfernt werden. Wie kann ich die Ausgabe erhalten, um es zu entfernen?

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')] 

Antwort

0

Lassen Sie uns versuchen:

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 

oder kürzere Version:

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)} 
+0

Eingabedaten: 'Data2 = {'index': '1', ' a ': Keine} ' ' Data3 = {' index ': Keine,' a ': Keine} ' –

2

können Sie diese Liste Verständnis verwenden:

>>> 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')]) 

Ein anderer Weg, können Sie Built-in Funktion any wie folgt verwenden:

>>> [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')])] 

Wenn Sie Data2 haben, Daten3 ... Daten 100, ändern range(2,4) zu range(2,101).

any(iterable)

Return True if any element of the iterable is true. If the iterable is empty, return False.

+0

könnten Sie erarbeiten, wie es Data2 UND Data3 Keine ist? –

+0

Wenn ich Data2, Data3 ... Data 100 habe, wie kann ich den zu verwendenden Code ändern? Danke –

+0

@happy Ich aktualisiere meine Antwort. – McGrady

Verwandte Themen