【问题标题】:Printing order of elements in a dictionary字典中元素的打印顺序
【发布时间】:2018-09-27 01:19:56
【问题描述】:

Dictionary parm 应该包含所有键 ['f', 'r', 'b', 'l', 't','u'],然后才会发生以下情况。下面提到的迭代以意外的顺序打印,请纠正错误。

parm = {'r':'r', 'l':'l', 't':'t', 'u':'u', 'f':'f', 'b':'b'}
if all(key in parm for key in ['f', 'r', 'b', 'l', 't','u']):
  parm = [_ for _ in parm.values() for i in range(0,9)]
  print (parm)

返回:

['b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 't', 't', 't', 't', 't', 't', 't', 't', 't']

预期:

['f',  'f',  'f',  'f',  'f',  'f',  'f',  'f',  'f',  'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 't', 't', 't', 't', 't', 't', 't', 't', 't', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u',]

【问题讨论】:

  • 欺骗stackoverflow.com/questions/15479928/…。而且您的代码仍然无效。
  • 更新代码,现在有效
  • 在 3.6 之前的 Python 版本中,字典中的项目顺序未定义。要在早期版本中保留顺序,请使用 collections.OrderedDict 而不是常规的 dict
  • 您似乎依赖于按特定顺序获取字典值。除了最新版本的 Python(2.x 肯定不是)之外,字典在所有版本中都不是这样工作的。
  • 另外,您为什么希望按该顺序返回值?这就是它们在列表中的排序方式,但那又怎样?这没有任何联系。

标签: python dictionary printing iteration python-2.x


【解决方案1】:

您的列表理解根据parm dict 的值的顺序生成项目(这在 Python 3.6 之前是非常任意的),因此它自然不会遵循您在条件中使用的键的顺序if 声明。如果您希望键以与条件中使用的键相同的方式重新排序,则应将其设为单独的列表并将其用于条件和列表理解:

parm = {'r':'r', 'l':'l', 't':'t', 'u':'u', 'f':'f', 'b':'b'}
keys = ['f', 'r', 'b', 'l', 't','u']
if all(key in parm for key in keys):
  parm = [parm[key] for key in keys for i in range(0,9)]
  print (parm)

【讨论】:

  • 使用 collections.OrderedDict 的良好替代方案(可能并非在所有情况下都可行)。
猜你喜欢
  • 2011-04-29
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
相关资源
最近更新 更多