我有一個具有以下結構的字典串列:
list_of_dicts = [
{'id': 1, 'fruits':['apple']},
{'id': 2, 'fruits':['orange']},
{'id': 3, 'fruits':['banana', 'apple']},
{'id': 4, 'fruits':['banana', 'apple', 'orange']}
]
我想list_of_dicts通過'fruits'鍵中包含的元素過濾。具體來說,我想將水果與可接受的水果串列進行比較:
acceptable_fruits = ['apple', 'banana']
此過濾器的預期結果應該是這樣的串列:
expected_result = [
{'id': 1, 'fruits':['apple']},
{'id': 3, 'fruits':['banana', 'apple']},
{'id': 4, 'fruits':['banana', 'apple', 'orange']}]
我試圖嵌套過濾陳述句,但這似乎不起作用:
filtered_list = filter(lambda dict: filter(lambda fruit: fruit in acceptable_fruits, dict['fruits']), list_of_dicts)
在這種情況下回傳的是原始串列:
print(list(filtered_list))
回傳:
[{'id': 1, 'fruits': ['apple']}, {'id': 2, 'fruits': ['orange']}, {'id': 3, 'fruits': ['banana', 'apple']}, {'id': 4, 'fruits': ['banana', 'apple', 'orange']}]
其他迭代回圈對我來說也不是很好。有沒有人有這樣做的好方法?
uj5u.com熱心網友回復:
問題是filter在 Python 3 中不回傳串列。顯然,您正在使用 為外部過濾器處理該串列list(filtered_list),但未filter處理內部過濾器,因此它的評估為True,如下所示:
>>> f = filter(None, [])
>>> bool(f)
True
為了解決這個問題,你可以只是包裝內filter的list(),但真的是你要問的是“任何fruit in acceptable_fruits?”,這是更好地寫any()。此外,list(filter(lambda))對于內在和外在的理解,最好寫成:
filtered_list = [
d for d in list_of_dicts
if any(fruit in acceptable_fruits for fruit in d['fruits'])]
結果:
[{'id': 1, 'fruits': ['apple']},
{'id': 3, 'fruits': ['banana', 'apple']},
{'id': 4, 'fruits': ['banana', 'apple', 'orange']}]
uj5u.com熱心網友回復:
用套裝很容易
list_of_dicts = [
{'id': 1, 'fruits':{'apple'}},
{'id': 2, 'fruits':{'orange'}},
{'id': 3, 'fruits':{'banana', 'apple'}},
{'id': 4, 'fruits':{'banana', 'apple', 'orange'}}
]
acceptable_fruits = {'apple', 'banana'}
result=[d for d in list_of_dicts if acceptable_fruits & d['fruits']]
print(result)
>>> [{'id': 1, 'fruits': {'apple'}}, {'id': 3, 'fruits': {'banana', 'apple'}}, {'id': 4, 'fruits': {'banana', 'apple', 'orange'}}]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/367474.html
上一篇:Python程式接受一個List,并提取所有頻率大于K的元素?
下一篇:Kotlin串列變換資料流
