防止OrderedDict在迭代期间将单个字符串值拆分为字符



我想使OrderedDict具有每个键的字符串和每个值的字符串列表。

from collections import OrderedDict
# Compare a dict with an OrderedDict
someDict = dict(a = ["foo","bar"], b = ["baz"])
someOrderedDict = OrderedDict([("a",("foo","bar")),("b",("baz"))])

我需要遍历这个字典,同时访问键和值。在vanilla字典中,这很简单:

for k,v in someDict.items():
    for eachv in v:
        print("do something with key = " + k + " and value = " + eachv)
# returns the desired output:
# do something with key = a and value = foo
# do something with key = a and value = bar
# do something with key = b and value = baz

(如果这可以在理解中完成,请给我启发——我想不出如何在不丢失钥匙的情况下做到这一点。)

当我在OrderedDict上尝试时,我得到:

for k,v in someOrderedDict.items():
    for eachv in v:
        print("do something with key = " + k + " and value = " + eachv) 
# results in undesirable splitting of value "baz" into ["b","a","z"]:
# do something with key = a and value = foo
# do something with key = a and value = bar
# do something with key = b and value = b
# do something with key = b and value = a
# do something with key = b and value = z

我做错了什么?

这是因为您将字符串(("baz"))分配给b键,而不是元组(("baz",))或字符串列表。

不是

someOrderedDict = OrderedDict([("a",("foo","bar")),("b",("baz"))])

someOrderedDict = OrderedDict([("a",("foo","bar")),("b",("baz",))])

(注意逗号)

您可以在"baz"之后添加,,以便在for循环期间将其解释为元组而不是单个str:

someOrderedDict = OrderedDict([("a",("foo","bar")),("b",("baz",))])

然后,迭代可以很好地抓取元组baz:

中的单个元素。
for k,v in someOrderedDict.items():
    for eachv in v:
        print("do something with key = " + k + " and value = " + eachv)
do something with key = b and value = baz
do something with key = a and value = foo
do something with key = a and value = bar

同样可以通过包装[]:

中的值来实现。
[("a", ["foo","bar"]),("b", ["baz"])]

更好的是,如果您已经有可用的字典,只需利用**语法在someOrderedDict中展开(解压缩)字典someDict:

someOrderedDict = OrderedDict(**someDict)

效果同样好,看起来更加紧凑和干净

最新更新