簡體   English   中英

對象列表:有效獲取第i個屬性之和的列表

[英]List of Objects: Efficiently getting a list of sum of ith attribute

抱歉,標題令人困惑,我不知道該如何正確表達這個問題。

我是班級項目/工作之外的編程新手,我正在嘗試養成良好的編程習慣,並在可能的地方避免循環(即避免效率低下的代碼)。 我正在從事的項目涉及從對象列表中獲取第ith個屬性的總和,而我設法對地圖進行了一些處理,但是我想知道是否有更好的方法。

假設我正在使用類Foo ,該類具有n個屬性a1a2 ,..., an ,所有整數以及包含這些對象中m個的列表l

例如,對於n = 3 ,我們可以有類似以下內容:

l = [Foo(a1 = 1, a2 = 2, a3 = 3), Foo(a1 = 1, a2 = 2, a3 = 3), Foo(a1 = 1, a2 = 2, a3 = 3)]

我希望我的結果看起來像:

sums = [3, 6, 9]

我這樣做是這樣的:

sums = [sum([x.a1 for x in l]),
        sum([x.a2 for x in l]), 
        sum([x.a3 for x in l])]

現在的問題是,如果Foo具有很多屬性,則鍵入每個x.an可能是不可行的。 屬性不一定也必須附加整數,因此它們可以是Foo(these, are, some, attributes)

因此,我的問題是,解決此問題的“智能”方法是什么? 它是否涉及循環的使用? 謝謝。

您可以使用inspect模塊提取初始化類實例所需的所有參數的列表。

然后使用列表推導迭代這些參數:

import inspect

class Foo():
    def __init__(self, a1, a2, a3):
        self.a1 = a1
        self.a2 = a2
        self.a3 = a3
        pass

# get list of arguments, ignore the first which is self
args = inspect.getfullargspec(Foo.__init__).args[1:]

l = [Foo(a1=1, a2=2, a3=3), Foo(a1=1, a2=2, a3=3), Foo(a1=1, a2=2, a3=3)]

# use list comprehension to sum by attribute
sums = [sum([getattr(x, i) for x in l]) for i in args]

# [3, 6, 9]

主要思想是使用getattr內置函數,該函數使用屬性名稱返回屬性值:

class Foo:
    def __init__(self,a1,a2,a3):
        self.a1 = a1
        self.a2 = a2
        self.a3 = a3

l = [Foo(a1 = 1, a2 = 2, a3 = 3), Foo(a1 = 1, a2 = 2, a3 = 3), Foo(a1 = 1, a2 = 2, a3 = 3)]

sums = [sum([getattr(x,'a{}'.format(i)) for x in l]) for i in range(1,4)]

暫無
暫無

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

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