[英]List of Objects: Efficiently getting a list of sum of ith attribute
抱歉,標題令人困惑,我不知道該如何正確表達這個問題。
我是班級項目/工作之外的編程新手,我正在嘗試養成良好的編程習慣,並在可能的地方避免循環(即避免效率低下的代碼)。 我正在從事的項目涉及從對象列表中獲取第ith個屬性的總和,而我設法對地圖進行了一些處理,但是我想知道是否有更好的方法。
假設我正在使用類Foo
,該類具有n個屬性a1
, a2
,..., 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.