簡體   English   中英

根據屬性過濾對象列表

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

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