簡體   English   中英

用Python中的字典循環遍歷字典列表的正確方法

[英]Right way to loop through list of dictionary with a dictionary in Python

我有車輛列表和過濾器字典。 代碼如下:

過濾詞典如下:

filters = {
  'make': 'SKODA',
  'model': 'Fabia',
  'fuel': 'Diesel',
  'transmission': '',
  'registration_year': '',
  'price': {'start': 10000, 'stop': 12000}
}

車輛清單如下:

vehicles = [
  {'make': 'AUDI', 'model': 'Q2 Dsl', 'type': '1.6 TDi Sport', 'fuel': 'Diesel', 'mileage': '19896', 'registration_year': '2017', 'transmission': 'Handbediende versnellingsbak', 'price': 17800}, 
  {'make': 'AUDI', 'model': 'A6 SW Dsl', 'type': '2.0 TDi S line', 'fuel': 'Diesel', 'mileage': '87354', 'registration_year': '2013', 'transmission': 'Handbediende versnellingsbak', 'price': 52000},
  {'make': 'SKODA', 'model': 'Fabia', 'type': '1.6 CR TDi GreenLine Active DPF', 'fuel': 'Diesel', 'mileage': '90613', 'registration_year': '2012', 'transmission': 'Handbediende versnellingsbak', 'price': 11000},
  {'make': 'AUDI', 'model': 'A4 SW Dsl', 'type': '2.0 TDi S tronic', 'fuel': 'Diesel', 'mileage': '47402', 'registration_year': '2016', 'transmission': 'Sequentiele bak', 'price': 93000},
  {'make': 'VOLKSWAGEN', 'model': 'Touran', 'type': '1.4 TSI Trendline', 'fuel': 'Essence', 'mileage': '28588', 'registration_year': '2017', 'transmission': 'Handbediende versnellingsbak', 'price': 87000},
  {'make': 'AUDI', 'model': 'A4 Dsl', 'type': '2.0 TDi', 'fuel': 'Diesel', 'mileage': '66053', 'registration_year': '2014', 'transmission': 'Handbediende versnellingsbak', 'price': 62000}
]

因此,我想循環遍歷所有車輛和所有過濾器並僅返回與過濾器匹配的車輛。 在這種情況下,我應該只得到斯柯達

我試過pydash庫,但沒有成功。

我嘗試了什么如下:

def filter_item(vehicle):
  vehicles = []
  for key, value in filters.items():
    if key == "price":
      if vehicle[key] > value['start'] and vehicle[key] < value['stop']:
        vehicles.append(vehicle)
    else:
      if vehicle[key] == value:
        vehicles.append(vehicle)
  return vehicles

result = py_.filter(vehicles, lambda x: filter_item(x))

但是在這種情況下,我得到所有帶有燃料類型柴油的車輛,但如果我們從0開始,我應該只獲得第二輛,因此只有斯柯達。

知道我該怎么辦? 還有更好的方法或更清潔的代碼嗎?

你需要檢查agaist所有過濾條件,這里有一個python內置filter的例子:

def filter_item(vehicle):
    vehicles = []
    for key, value in filters.items():
        if not value: # skip empty filter
            continue
        if key == "price":
            if vehicle[key] > value['start'] and vehicle[key] < value['stop']:
                continue
        else:
            if vehicle[key] == value:
                continue
        return False # no filter matched
    return True


result = filter(filter_item, vehicles)

與pydash:

result = py_.filter(vehicles, filter_item)

注意:傳遞給fitler回調函數返回true,表示當前值應包含在結果中。

我認為價格范圍應該從filters分離出來。 它在那里很尷尬,因為它是唯一不能直接匹配車輛相同鍵的相應值的鍵。

我會這樣寫的

>>> filters = {
...:  'make': 'SKODA',
...:  'model': 'Fabia',
...:  'fuel': 'Diesel',
...:  'transmission': '',
...:  'registration_year': '',
...:}
>>> price_range = range(10000, 12000 + 1)
>>>
>>> [vehicle['make'] for vehicle in vehicles if
...:all(vehicle.get(k) == v for k, v in filters.items() if v) and
...:vehicle['price'] in price_range]
>>> ['SKODA']

或者像這樣

>>> [vehicle for vehicle in vehicles if
...:all(vehicle.get(k) == v for k, v in filters.items() if v) and
...:vehicle['price'] in price_range]
>>> 
[{'fuel': 'Diesel',
  'make': 'SKODA',
  'mileage': '90613',
  'model': 'Fabia',
  'price': 11000,
  'registration_year': '2012',
  'transmission': 'Handbediende versnellingsbak',
  'type': '1.6 CR TDi GreenLine Active DPF'}]

如果你想要匹配的完整車輛詞典。

暫無
暫無

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

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