如何在 python 的循环中向字典添加新的键和值,这是 class 对象的一个​​属性

how to add new key and value to dictionary, which is an attribute of a class object, in a loop in python

我想遍历 python 中的循环并向对象的每个属性添加新的键和值。我尝试实施 setattr() 只是为了意识到我只是在修改属性,而不是添加新的键和值集。

class Product(object):
    def __init__(self, price = None, units = None):
        if price is None:
            self.price = {}
        if units is None:
            self.units = {}


dates = ['10/20', '10/21', '10/22']
prices = [12.5, 12.7, 12.3] 
units = [100, 200, 300] 

cookie = Product()

for i in range(len(dates)):
    date = dates[i]
    price = prices[i]
    unit = units[i]
    data = [price, unit]
    keys = list(cookie.__dict__.keys())
    for attr, val in zip(keys, data):
        newD = {}
        newD[date] = val
        setattr(cookie, attr, newD) 
print(cookie.price)
print(cookie.units)

我要

    cookie.price = {'10/20': 12.5, '10/21': 12.7, '10/22': 12.3}
    cookie.units = {'10/20': 100, '10/21': 200, '10/22': 300}

作为我的结果,但正如我之前提到的,我得到

    cookie.price = {'10/22': 12.3}
    cookie.units = {'10/22': 300}

有什么方法可以为每个字典属性附加一组新的键和值吗?

我只关注 for 循环,因为那部分需要更改。 其他都还好。

遍历列表并获取值很好。 更新实例中数据的最简单方法就是调用它们。
通常,您只需调用

即可将新值添加到字典中
dic[new key] = new_value

有了它,我们就可以简单地做到这一点

for i in range(len(dates)):
    date = dates[i]
    price = prices[i]
    unit = units[i]

    cookie.price[date] = price
    cookie.units[date] = unit

运行这个跟其余代码一样returns

{'10/20': 12.5, '10/21': 12.7, '10/22': 12.3}
{'10/20': 100, '10/21': 200, '10/22': 300}

########################################### ##############
更新
################################################## ########
如果您想添加很多属性并想要更通用的方法,您可以从这个角度来考虑。

我想出了一些随机属性并将它们添加到 class。

class Product(object):
    def __init__(self, price = None, units = None,sold=None,bought=None,loc=None):
        if price is None:
            self.price = {}
        if units is None:
            self.units = {}
        if sold is None:
            self.sold = {}
        if bought is None:
            self.bought = {}
        if loc is None:
            self.loc = {}

我也给了他们一些随机值

dates = ['10/20', '10/21', '10/22']
prices = [12.5, 12.7, 12.3] 
units = [100, 200, 300] 
solds = [10,20,30]
boughts = [100,200,300]
locs = ['san','cali','int']

然后我们设置一个class\

的实例
cookie = Product()

我们还设置了我们正在使用的所有属性的列表\

attrs = ['price','units','sold','bought','loc']

稍后我们将需要它来访问我们产品的所有属性。

然后我们遍历并设置我们的值:\

for i in range(len(dates)):
    date = dates[i]
    price = prices[i]
    unit = units[i]
    sold = solds[i]
    bought = boughts[i]
    loc = locs[i]
    values = [price,unit,sold,bought,loc]

请注意,重要的是我们在此处创建的值列表与上面的属性列表具有相同的顺序。
另外,请注意列表中缺少 date

现在对于解决方案本身,我们使用 getattr

    for z in range(len(attrs)):
    attr = attrs[z]
    value = values[z]
    
    getattr(cookie,attr)[date] = value 

我们遍历属性列表。
现在我们使用索引来获取正确的值,这就是为什么保持相同的顺序很重要。

getattr 与 class.attribute 相同(例如 cookie.price)。
我们给它正确的实例,然后是属性名。
然后我们使用与我原来的答案相同的方式来设置新值。

运行 这个 returns:\

{'10/20': 12.5, '10/21': 12.7, '10/22': 12.3}
{'10/20': 100, '10/21': 200, '10/22': 300}
{'10/20': 10, '10/21': 20, '10/22': 30}
{'10/20': 100, '10/21': 200, '10/22': 300}
{'10/20': 'san', '10/21': 'cali', '10/22': 'int'}

以下是所有代码:\

class Product(object):
    def __init__(self, price = None, units = None,sold=None,bought=None,loc=None):
        if price is None:
            self.price = {}
        if units is None:
            self.units = {}
        if sold is None:
            self.sold = {}
        if bought is None:
            self.bought = {}
        if loc is None:
            self.loc = {}

dates = ['10/20', '10/21', '10/22']
prices = [12.5, 12.7, 12.3] 
units = [100, 200, 300] 
solds = [10,20,30]
boughts = [100,200,300]
locs = ['san','cali','int']

attrs = ['price','units','sold','bought','loc']
cookie = Product()

for i in range(len(dates)):
    date = dates[i]
    price = prices[i]
    unit = units[i]
    sold = solds[i]
    bought = boughts[i]
    loc = locs[i]
    values = [price,unit,sold,bought,loc]
    
    for z in range(len(attrs)):
        attr = attrs[z]
        value = values[z]
        
        getattr(cookie,attr)[date] = value