[英]Filtering list of objects based on attribute
我有 4 個對象。
class MyObject:
def __init__(self, id: int, result_name: str):
self.id = id
self.result = Result(result_name)
class Result:
def __init__(self, name: str):
self.name = name
object1 = MyObject(1, 'A')
object2 = MyObject(2, 'A')
object3 = MyObject(3, 'B')
object4 = MyObject(4, 'B')
它們存儲在一個元組中:
x_ids = (object1, object2, object3, object4)
我想要基於參數:
[x.result.name for x in x_ids]
>> ("A", "A", "B", "B")
有結果列表的列表,只有兩個具有“A”和“B”屬性的對象
result = (object(1or2), object(3or4))
我怎樣才能通過列表理解來實現它?
你可以用一組很容易地做到這一點:
class MyObject:
def __init__(self, id_, result_name):
self.id_ = id_
self.result = Result(result_name)
class Result:
def __init__(self, name):
self.name = name
object1 = MyObject(1, 'A')
object2 = MyObject(2, 'A')
object3 = MyObject(3, 'B')
object4 = MyObject(4, 'B')
T = (object1, object2, object3, object4)
S = {o.result.name for o in T}
print(S)
Output:
{'A', 'B'}
筆記:
如果您需要的話,您顯然可以將集合轉換為列表。
使用id作為變量名不是一個好主意
你可以使用reduce
from functools
。
讓我們從創建示例數據開始:
class MyObject:
def __init__(self, id: int, result_name: str):
self.id = id
self.result = Result(result_name)
class Result:
def __init__(self, name: str):
self.name = name
object1 = MyObject(1, 'A')
object2 = MyObject(2, 'A')
object3 = MyObject(3, 'B')
object4 = MyObject(4, 'B')
x_ids = (object1, object2, object3, object4)
現在我們執行列表理解:
from functools import reduce
result = tuple(reduce(lambda t, s: {**t, s.result.name: s}, x_ids, {}).values())
結果:
(object2, object4)
列表理解(減少)以空字典{}
開始。 每次迭代, x_ids
中的一個條目作為s
傳遞給 lambda function,字典的當前 state 作為t
傳遞。 通過添加帶有鍵s.result.name
s
object 來更新字典。 如果該鍵已經存在,條目將被覆蓋——這會過濾掉具有相同結果名稱的對象。 結果是一個字典: {'A':object2, 'B':object4}
。 然后將結果轉換為所需的元組格式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.