2017-01-31 1 views
2

Neu hier Pythonentfernen dict Element aus der Liste des dicts mit Lambda

Ich versuche, eine neue Liste zu erstellen, in dem jeder dict von dem ersten Liste ein Element hat entfernt, es existiert:

arraylist = [{"x":1, "y":2}, {"x":3, "y":2}, {"x":5, "y":2}, {"x":33, "y":2}, {"x":1, "y":8}] 
arraylist = map(lambda d: del d["y"] if "y" in d, arraylist) 

Ich weiß, ich kann es mit für, mit del tun. Aber ich möchte etwas Neues lernen.

+1

Mit 'lambda' wie das ist nicht Pythonic Verwenden Sie 'Lambda' nur dann, wenn Sie eine anonyme Funktion benötigen (zB als Sortierschlüssel) –

+0

@Chris_Rands Warum unterscheidet sich Lambda mit map grundlegend von der Verwendung von Lambda mit sort? – koalo

+1

@koalo Ein Listenverständnis ist fast immer etwas schneller (und lesbarer) als 'map' mit' lambda', aber man kann kein Verständnis als Schlüssel für 'sorted() verwenden' –

Antwort

4

eine Liste Verständnis Verwendung:

In [26]: [{x:d[x] for x in d if x != 'y'} for d in arraylist] 
Out[26]: [{'x': 1}, {'x': 3}, {'x': 5}, {'x': 33}, {'x': 1}] 
+0

was passiert, wenn es viele andere Elemente in jedem dict gibt? Sie werden entfernt. –

+0

@AlexandruRada Nein, als eine Tatsache macht dieser Code keine Entfernung, es fügt nur ungültige Elemente nicht ein. Wenn Sie also mehrere ungültige Schlüssel haben, können Sie einfach Ihre Bedingung in 'if x nicht in list_of_invalid_keys' ändern. – Kasramvd

+0

ok, Sie haben Recht. In einem Produktionssystem wissen Sie genau, was drin sein sollte. –

2

Sie Filter wie diese Sie

arraylist = [{"x":1, "y":2}, {"x":3, "y":2}, {"x":5, "y":2}, {"x":33, "y":2}, {"x":1, "y":8}] 
arraylist = map(lambda d: dict(filter(lambda (k,v): k != "y", d.iteritems())), arraylist) 
0

verwenden, können nicht del in einer lambda Funktion verwenden können, weil del eine Aussage und eine lambda ‚s Körper ist kann nur ein einziger Ausdruck sein. Sie können keine Anweisung in einen Ausdruck einfügen. Man könnte es mit einer gewöhnlichen Funktion funktioniert:

def delete_y(d): 
    if "y" in d: 
     del d['y'] 
    return d 

Beachten Sie, dass del wie dies mit dem Wörterbuch d anstelle modifiziert. Dies bedeutet, dass die Rückgabe des modifizierten Wörterbuchs (und die Verwendung des Rückgabewerts zum Erstellen einer neuen Liste) redundant ist. Die ursprüngliche Datenstruktur, aus der das Wörterbuch stammt, hat bereits die modifizierte Version.

0

Vielleicht ist es nicht der kürzeste Weg, aber es ist auf jeden Fall eine bequeme Möglichkeit, Elemente aus einer Liste zu entfernen:

arraylist = [{"x":1, "y":2}, {"x":3, "y":2}, {"x":5, "y":2}, {"x":33, "y":2}, {"x":1, "y":8}] 

print arraylist 

def containsY(d): 
    if 'y' in d.keys(): 
     del d['y'] 
     return True 
    return False 

filter(containsY, arraylist) 

print arraylist 

Ausgang:

[{'y': 2, 'x': 1}, {'y': 2, 'x': 3}, {'y': 2, 'x': 5}, {'y': 2, 'x': 33}, {'y': 8, 'x': 1}] 
[{'x': 1}, {'x': 3}, {'x': 5}, {'x': 33}, {'x': 1}] 
+0

Warum gibt Ihr 'containsY' etwas zurück? –

+0

Sie haben Recht, es muss nichts zurückgeben, aber "filter" soll Methoden mit einem zurückgegebenen Booleschen Wert verwenden, also wollte ich es einfach "nach dem Buch" machen –

+0

Das Ergebnis von 'filter' wirklich wegwerfen ist aber nicht "nach dem Buch". –

Verwandte Themen