簡體   English   中英

Dict列表中的Python列表推導

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM