2016-04-17 7 views
0

Ich habe eine Liste, die dicts wie folgt enthält:Python Listenkomprehension in Dict Liste

[ 
    {'match_id': 1L, 'player_b_id': 2L, 'round_id': 1L, 'match_winner_id': 2L, 'match_date': datetime.date(2016, 3, 9), 'player_a_id': 1L, 'tournament_id': 1L}, 
    {'match_id': 2L, 'player_b_id': 4L, 'round_id': 1L, 'match_winner_id': 4L, 'match_date': datetime.date(2016, 3, 10), 'player_a_id': 3L, 'tournament_id': 1L} 
] 

und ich frage mich, wie kann ich jedes 'match_date' auf ein String Datum des Elements ändern. Ich weiß, dass dies mit einer normalen Schleife erreicht werden kann, aber ich versuche, über List Comprehensions zu lernen und bin in diesem Teil steckengeblieben.

habe ich versucht, so etwas wie dies ohne Erfolg:

matchesData = [str(v) if k == 'match_date' else v for k, v in enumerate(matchesData)] 

Antwort

3

Wenn Sie müssen eine Liste Verständnis verwenden, dann müssen Sie auch jedes Wörterbuch neu zu erstellen:

matchesData = [{k: str(v) if k == 'match_date' else v for k, v in d.items()} 
       for d in matchesData] 

oder

verwenden
matchesData = [dict(d, match_date=str(d['match_date'])) 
       for d in matchesData] 

Das erste Beispiel verwendet ein Wörterbuch co Mprehension, die einfach ein neues Wörterbuch aus dem alten erstellt, indem jedes Schlüssel/Wert-Paar durchlaufen wird. Für den Schlüssel 'match_date' werden die Werte über die Funktion str() übergeben. Dies bedeutet, dass der Schlüssel match_date völlig optional ist.

Die zweite Version erfordert'match_date' zu existieren, und erstellt eine Kopie des ursprünglichen Wörterbuch mit den dict() function, in einem zusätzlichen Schlüsseladdiereinheit (die das ursprüngliche 'match_date' Schlüssel-Wert-Paar aus d ersetzen wird).

Demo:

>>> from pprint import pprint 
>>> matchesData = [ 
...  {'match_id': 1L, 'player_b_id': 2L, 'round_id': 1L, 'match_winner_id': 2L, 'match_date': datetime.date(2016, 3, 9), 'player_a_id': 1L, 'tournament_id': 1L}, 
...  {'match_id': 2L, 'player_b_id': 4L, 'round_id': 1L, 'match_winner_id': 4L, 'match_date': datetime.date(2016, 3, 10), 'player_a_id': 3L, 'tournament_id': 1L} 
... ] 
>>> pprint([{k: str(v) if k == 'match_date' else v for k, v in d.items()} for d in matchesData]) 
[{'match_date': '2016-03-09', 
    'match_id': 1L, 
    'match_winner_id': 2L, 
    'player_a_id': 1L, 
    'player_b_id': 2L, 
    'round_id': 1L, 
    'tournament_id': 1L}, 
{'match_date': '2016-03-10', 
    'match_id': 2L, 
    'match_winner_id': 4L, 
    'player_a_id': 3L, 
    'player_b_id': 4L, 
    'round_id': 1L, 
    'tournament_id': 1L}] 
>>> pprint([dict(d, match_date=str(d['match_date'])) for d in matchesData]) 
[{'match_date': '2016-03-09', 
    'match_id': 1L, 
    'match_winner_id': 2L, 
    'player_a_id': 1L, 
    'player_b_id': 2L, 
    'round_id': 1L, 
    'tournament_id': 1L}, 
{'match_date': '2016-03-10', 
    'match_id': 2L, 
    'match_winner_id': 4L, 
    'player_a_id': 3L, 
    'player_b_id': 4L, 
    'round_id': 1L, 
    'tournament_id': 1L}]