Python:迭代字典键'每个键的值数不均匀的值

时间:2018-06-18 22:47:07

标签: python loops dictionary math

我无法浏览字典的密钥'值和执行数学运算,其中每个键具有不同数量的值:

fruits  = {
"banana": [4,5],
"apple": 2,
"orange":1.5,
"pear": 3   
}

我从代码中得到的东西(即我的理想作品):

banana [8, 10]
apple 4
orange 3.0
pear 6

我希望每个键中的每个整数(*)乘以2.我已经尝试了以下但我无法做到正确:

for fruit, price in fruits.items():
    print(fruit, price*2)
    for i in price:
        print(fruit, i*2)

......但无济于事:这会产生:

banana [4, 5, 4, 5]
banana 8
banana 10
apple 4

好的,所以我试过了:

for fruit, price in fruits.items():
#print(type(price))

if len(fruit)>0:
    print(price*2)

elif len(fruit) == 0:
    print(price*2)

它产生了这个:

[4, 5, 4, 5]
4
3.0
6

这甚至可能吗?

任何答案都将不胜感激。

亲切的问候,

一个。史密斯

2 个答案:

答案 0 :(得分:0)

此代码运行,与您的代码不同......但我不确定这是否完全满足您的尝试。您的代码会引发TypeError: 'int' object is not iterable,因此导入collections并检查您的项目是否可迭代可以安全地执行此操作:

import collections
fruits = {
    "banana": [4, 5],
    "apple": 2,
    "orange": 1.5,
    "pear": 3
}

for fruit, price in fruits.items():
    if isinstance(price, collections.Iterable):
        for i in price:
            print(fruit, i * 2)
    else:
        print(fruit, price * 2)

<强>结果

banana 8
banana 10
apple 4
orange 3.0
pear 6

答案 1 :(得分:0)

如果列表是例外而不是规则,那么您可以使用try / except,如下所示:

def multiplier(x, n):
    try:
        return float(x)*n
    except TypeError:
        return [i*n for i in x]

res = {k: multiplier(v, 2) for k, v in fruits.items()}

print(res)

{'banana': [8, 10], 'apple': 4.0, 'orange': 3.0, 'pear': 6.0}

或者,如果您希望显式测试iterables,则可以使用collections.Iterable

from collections import Iterable

def multiplier(x, n):
    return [i*n for i in x] if isinstance(x, Iterable) else x*n

然后,对于格式化的输出,您可以迭代结果:

for k, v in res.items():
    print(k, v)

banana [8, 10]
apple 4.0
orange 3.0
pear 6.0