【问题标题】:prevent OrderedDict from splitting single string value into characters during iteration防止 OrderedDict 在迭代期间将单个字符串值拆分为字符
【发布时间】:2016-06-30 14:25:13
【问题描述】:

我想创建一个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"))])

我需要通过访问键和值来遍历这个字典。在普通字典上,这很简单:

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

我做错了什么?

【问题讨论】:

    标签: python python-3.x dictionary ordereddictionary


    【解决方案1】:

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

    代替

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

    试试

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

    (注意新的逗号。)

    【讨论】:

      【解决方案2】:

      您可以在"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)
      

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

      【讨论】:

      • 谢谢 -- 我接受这一点是因为 ** 可能对其他用户有用,但值得注意的是,如果保持原始顺序很重要(这就是我想使用 OrderedDict 的原因)然后需要使用原始结构。
      • @C8H10N4O2 我记得在 python 跟踪器上看到一个问题,用于在解包时保持订单,可能很快也会添加,我会看看我是否可以找到它的 url 并检查它的状态。
      猜你喜欢
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 2022-09-27
      • 1970-01-01
      相关资源
      最近更新 更多