[英]Python List Comprehensions in Dict List
我有一個包含這樣的字典的列表:
[
{'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}
]
我想知道如何將每個元素的'match_date'
修改為字符串日期。 我知道可以使用常規循環來完成此操作,但是我試圖了解列表理解並陷入這一部分。
我嘗試這樣的事情沒有成功:
matchesData = [str(v) if k == 'match_date' else v for k, v in enumerate(matchesData)]
如果必須使用列表推導,則還必須重建每個字典:
matchesData = [{k: str(v) if k == 'match_date' else v for k, v in d.items()}
for d in matchesData]
或使用
matchesData = [dict(d, match_date=str(d['match_date']))
for d in matchesData]
第一個示例使用字典理解,該函數通過循環遍歷每個鍵值對,簡單地從舊字典創建新字典。 對於'match_date'
鍵,值通過str()
函數傳遞。 這意味着match_date
鍵是完全可選的。
第二個版本要求 'match_date'
存在,並使用dict()
函數創建原始詞典的副本,並添加一個額外的鍵(它將替換d
的原始'match_date'
鍵值對)。
演示:
>>> 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}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.