簡體   English   中英

將 for 循環轉換為具有多個字典的列表理解

[英]Convert for loop to list comprehension having multiple dictionaries

積分榜

[{'driver': 'Max Verstappen', 'team': 'Red Bull', 'home_country': 'Netherlands', 'points': 0}, {'driver': 'Lewis Hamilton', 'team': 'Mercedes', 'home_country': 'United Kingdom', 'points': 0}, {'driver': 'George Russell', 'team': 'Mercedes', 'home_country': 'United Kingdom', 'points': 0}, {'driver': 'Sergio Perez', 'team': 'Red Bull', 'home_country': 'Mexico', 'points': 0}, {'driver': 'Lando Norris', 'team': 'McLaren', 'home_country': 'United Kingdom', 'points': 0}, {'driver': 'Charles Leclerc', 'team': 'Ferrari', 'home_country': 'Monaco', 'points': 0}, {'driver': 'Valtteri Bottas', 'team': 'Ferrari', 'home_country': 'Spain', 'points': 0}]

driver_with_points

{'Carlos Sainz': 18, 'Charles Leclerc': 26, 'Esteban Ocon': 6, 'Fernando Alonso': 2, 'George Russell': 12, 'Kevin Magnussen': 10, 'Lewis Hamilton': 15, 'Valtteri Bottas': 8, 'Yuki Tsunoda': 4, 'Zhou Guanyu': 1}

如果司機名稱存在於driver_with_points字典中,我必須根據司機在driver_with_points字典中的分數更新排名列表。

該任務只需通過以下幾行即可完成。

for driver in standings:
    if driver["driver"] in drivers_with_points.keys():
        driver["points"] = drivers_with_points[driver["driver"]]
    

但是我需要通過使用列表理解來完成類似的任務。

任何人都可以幫助我將這個 for 循環轉換為列表理解嗎?

我努力了

[driver["points"]=drivers_with_points[driver["driver"]] for driver in standings if driver["driver"] in drivers_with_points.keys()]

但這是錯誤Unresolved reference 'drivers_with_points

使用理解來執行此操作沒有錯,但您不應該以更新現有數據結構為目標。 有了理解,您應該制作一個列表而不是改變原始列表。 理解來自函數式編程,其中不可變數據是目標。

您可以使用列表理解來制作一個新列表,然后您可以將其分配給standings 一種方法是解壓原始 dict 並將點替換為driver_with_points中的值或原始值(如果未找到)。 dict.get(key, some_default)是一個很好的模式。

考慮:

standings = [{'driver': 'Max Verstappen', 'team': 'Red Bull', 'home_country': 'Netherlands', 'points': 0}, {'driver': 'Lewis Hamilton', 'team': 'Mercedes', 'home_country': 'United Kingdom', 'points': 0}, {'driver': 'George Russell', 'team': 'Mercedes', 'home_country': 'United Kingdom', 'points': 0}, {'driver': 'Sergio Perez', 'team': 'Red Bull', 'home_country': 'Mexico', 'points': 0}, {'driver': 'Lando Norris', 'team': 'McLaren', 'home_country': 'United Kingdom', 'points': 0}, {'driver': 'Charles Leclerc', 'team': 'Ferrari', 'home_country': 'Monaco', 'points': 0}, {'driver': 'Valtteri Bottas', 'team': 'Ferrari', 'home_country': 'Spain', 'points': 0}]
drivers_with_points = {'Carlos Sainz': 18, 'Charles Leclerc': 26, 'Esteban Ocon': 6, 'Fernando Alonso': 2, 'George Russell': 12, 'Kevin Magnussen': 10, 'Lewis Hamilton': 15, 'Valtteri Bottas': 8, 'Yuki Tsunoda': 4, 'Zhou Guanyu': 1}

# make a new list with new dicts:
standings = [{**s, 'points': drivers_with_points.get(s['driver'], s['points'])} for s in standings]

這將為您提供一個新列表並為其指定standings

[{'driver': 'Max Verstappen',
  'team': 'Red Bull',
  'home_country': 'Netherlands',
  'points': 0},
 {'driver': 'Lewis Hamilton',
  'team': 'Mercedes',
  'home_country': 'United Kingdom',
  'points': 15},
 {'driver': 'George Russell',
  'team': 'Mercedes',
  'home_country': 'United Kingdom',
  'points': 12},
 {'driver': 'Sergio Perez',
  'team': 'Red Bull',
  'home_country': 'Mexico',
  'points': 0},
 {'driver': 'Lando Norris',
  'team': 'McLaren',
  'home_country': 'United Kingdom',
  'points': 0},
 {'driver': 'Charles Leclerc',
  'team': 'Ferrari',
  'home_country': 'Monaco',
  'points': 26},
 {'driver': 'Valtteri Bottas',
  'team': 'Ferrari',
  'home_country': 'Spain',
  'points': 8}]

你不能在理解中做作業 (A=B)。 您可以使用更新 function。例如:

[driver.update({'points': drivers_with_points[driver["driver"]]}) for driver in standings if driver["driver"] in drivers_with_points.keys()]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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