繁体   English   中英

python中字典迭代的问题

[英]Problem with dictionary iteration in python

我是 python 新手,所以也许我的问题很容易解决。 我有一个字典组织如下:my_dict = {'x': (1.1, 3.4), 'y': (4.3, 7.5), 'z': (7.3, 9.5)}。 我想将每个值减少相同的数字,所以这就是我想要做的:

for k,v in my_dict.items():
    for a, b in v:
        a = a * 0.3
        b = b * 0.3 
        my_dict[k] = (a, b)
return my_dict

使用此代码时,我收到此错误:

for a, b in v:
TypeError: 'float' object is not iterable

所以看起来“for a, b in v”循环试图遍历float,这是不可能的。 因此,我尝试在 for 循环中打印 my_dict.items() 和 k,v,以查看 for 循环迭代的内容,这就是我得到的:

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

[('x', (1.1, 3.4)), ('y', (4.3, 7.5)), ('z', (7.3, 9.5))]
y (4.3, 7.5)

我可以看到两件奇怪的事情: - 我期待“print k,v”命令打印每个键,值对,但我只得到 y 键及其值 - 通过查看 my_dict.items(),它在我看来, v 不是一个浮点数,而是一个包含两个浮点数的元组。 那么为什么我会得到 float object is not iterable 错误呢?

任何帮助都非常感谢。 再次,如果这是一个愚蠢的问题,我很抱歉,但我刚开始使用 python 并且我坚持这个。

谢谢!

你可以在这里使用字典理解

>>> {k: tuple(i * 0.3 for i in v) for k, v in my_dict.items()}
{'x': (0.33, 1.02), 'y': (1.2899999999999998, 2.25), 'z': (2.19, 2.85)}

@CoryKramer 已经掌握了 Pythonic 的方法来做到这一点。 专注于你的代码......

你的内在“循环”不是正确的技术。 您不需要遍历元组——一次需要一个元素,而您一次需要两个。 相反,您需要“解包”元组。

my_dict = {'x': (1.1, 3.4), 'y': (4.3, 7.5), 'z': (7.3, 9.5)}

for k,v in my_dict.items():
    print("dict:", k, v)
    a, b = v
    print("val:", a, b)
    a = a * 0.3
    b = b * 0.3
    my_dict[k] = (a, b)

for a, b in v的代码行没有意义,因为只有一个值v是您的元组。 您已经在外循环中遍历字典中的项目。 请尝试以下操作:

for k,v in my_dict.items():
    a, b = v
    a = a * 0.3
    b = b * 0.3 
    my_dict[k] = (a, b)
return my_dict

这里的问题是,通过这样做:

for a, b in v

您正在尝试迭代单个元组,这实际上没有意义,因为您已经在对其进行解包

请注意,您只需要将其值解包为:

k,v = next(iter(my_dict.items()))
a, b = v

现在ab分别包含两个元组值。 因此,在你的代码的唯一的问题是内部for

所以很明显没有意义,但是为什么会出现错误呢?

这是因为 Python 期望v是可迭代的可迭代对象,因为您试图将每个可迭代对象解包为kv 在这种情况下,当您迭代v ,要返回的第一个项目是它的第一个float ,它无法解包。

请注意,如果我们改为迭代包含元组的列表,您的方法将起作用:

for k,v in my_dict.items():
    for a, b in [v]:
        a = a * 0.3
        b = b * 0.3 
        my_dict[k] = (a, b)

不过,正如前面提到的,这没有意义,因为您可以直接解压缩它们:

for k,v in my_dict.items():
    a, b = v
    a = a * 0.3
    b = b * 0.3 
    my_dict[k] = (a, b)

您不必遍历元组,只需将其分配给变量:

for k,v in my_dict.items():
    a, b = v
    a = a * 0.3
    b = b * 0.3 
    my_dict[k] = (a, b)
return my_dict

和一个更好的解决方案:

for k,v in my_dict.items():
    my_dict[k] = tuple([0.3*x for x in v])
return my_dict

您可以解压缩您的 dict 值:

for k, (a, b) in my_dict.items():
    a *= 0.3
    b *= 0.3 
    my_dict[k] = (a, b)

或者你可以使用:

dict(map(lambda x: (x[0], (x[1][0]*0.3, x[1][1]*0.3)),   my_dict.items()))

我建议使用字典理解:

my_dict = {'x': (1.1, 3.4), 'y': (4.3, 7.5), 'z': (7.3, 9.5)}

f = 0.3
my_dict = {k:(a*f,b*f) for k,(a,b) in my_dict.items()}

print(my_dict)  # {'x': (0.33, 1.02), 'y': (1.2899999999999998, 2.25), 'z': (2.19, 2.85)}

如果要保留循环,则必须删除嵌套的 for 循环,因为扩展元组不需要它。 你可以简单地写成这样:

for k,(a,b) in my_dict.items():
    my_dict[k] = (a*0.3, b*0.3)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM