Python:将2个词典中的值与相同的键进行比较

时间:2014-11-17 20:33:24

标签: python

你好我是python的新手,我有一个关于字典的问题:

我们说我们有一本字典:

Cars {"Audi": {"Wheels": 4, "Body": 1, "Other": 20},"Ford": {"Wheels": 2, "Body": 3, "Other":10},"BMW": {"Wheels": 5, "Body": 0.5, "Other": 30}}

和其他字典:

Materials {"Wheels": 30, "Body": 5, "Other": 110}

我想用我所拥有的材料返回我可以生产的汽车数量:

def production(car,Materials):
return

production("Audi",Materials)

此示例中的输出应返回数字5,因为只有5个正文部分可供使用。 我想要以某种方式使它成为这样:  将材料中的值除以汽车的值。然后将数字写入另一个列表,然后返回整个最小数字。

更多的exaples:

production("BMW",Materials)
3.0 # because the value of key only is 110 and for 3 cars we need 90 other:
production("Ford",Materials)
1.0 # because the value of key body is 3 and for 1 car we need 3 body:

我事先感谢你的一切。

3 个答案:

答案 0 :(得分:5)

如果你想要的是看看在不影响Materials内容的情况下可以创建任何给定汽车的数量,你可以这样编写你的方法:

def number_of_units_creatable(car_key):
    required_parts = Cars[car_key]
    return min(Materials["Wheels"] // required_parts["Wheels"], 
               Materials["Body"] // required_parts["Body"], 
               Materials["Other"] // required_parts["Other"])

在制作中,您需要添加有条件的警卫来检查您的CarsMaterials是否具有所有必需的密钥。如果您尝试获取不存在的密钥的值,则会收到异常。

这将允许您使用Materials中可用的资源计算出您可以创建的任何给定汽车的最大数量。

我强烈建议你不要使用这样的嵌套dicts - 这个设计可以通过创建一个Materials类来大大帮助,并将其存储为你的值而不是另一个字典。 abarnert在他的帖子中对此有一点了解。

另一个由abarnert提示的注释 - 依赖两个单独词典之间的所有共享的静态密钥组是一个非常糟糕的主意。如果你想建造一辆装甲车,现在你需要一把枪,会发生什么?您必须在每辆车的必需属性中添加Gun: 0,否则您将遇到异常。每辆车都要求每辆汽车所需的每一件汽车都有一个入口,除了汽车没有汽车这样的事实之外,其中很多汽车都没有任何意义。 t 需要它。就目前而言,你的设计既非常有限又脆弱 - 只要你尝试添加一些新东西,它就会很好地破坏。

答案 1 :(得分:3)

如果可能的材料集合是静态集合 - 也就是说,它只能有“Wheels”,“Body”和“Other” - 那么你真的应该使用类而不是dict,{ {3}},但可以使用您现有的数据结构伪造它,正如他的回答所示。

但是,如果可能的材料集是开放式的,那么您不希望明确地逐个引用它们;你想循环它们。类似的东西:

for material, count in car.items():

在这种情况下:

return min(Materials[material] // count for material, count in car.items())

答案 2 :(得分:1)

您可以迭代材质并递减值,直到一个变为0:

def production(car, materials):
    count = 0
    while 0 not in materials.values():
        for part in cars[car]:
            materials[part] -= 1
        count += 1
    return count

如果您不想更改材料字典:

def production(car, materials):
    count = 0
    vals = materials.values()
    while not 0 in vals:
        for ind, part in enumerate(Cars[car]):
            vals[ind] -= 1
        count += 1
    return count