【问题标题】:Convert a dict to tuple preserving order [duplicate]将字典转换为元组保留顺序[重复]
【发布时间】:2017-11-26 14:42:50
【问题描述】:

我有一本字典,这是一个示例字典,它可以有任意数量的字段

{'name': 'satendra', 'occupation': 'engineer', 'age': 27}

如何将其转换为元组,以便生成元组的有序列表。

# Expected output
[('name', 'satendra'), ('occupation', 'engineer'), ('age', 27)]

更新

OrderedDict 在传递给它的元组的有序列表而不是 JSON 对象时很有用,所以我猜这不是重复的

【问题讨论】:

  • 按顺序是指保留键值对吗?
  • 如果name 键是我的字典中的第一个字段,所以当我将它转换为元组时它也应该排在第一位
  • 使用OrderedDict,它本质上是一个元组列表。
  • @Satendra 当然可以。您需要使用OrderedDict 开头。
  • JSON 对象也是无序的。键只是没有顺序;没有什么可保存的。 “An object is an unordered set of name/value pairs.”。

标签: python dictionary


【解决方案1】:

就像您已经从 cmets 中了解到的那样,没有要保存的顺序,因为开始时没有顺序。此 JSON 可能以任意顺序从服务器到达。

但是,如果您知道您感兴趣的键,您可以自己构建元组列表。

请注意,此代码以已知顺序迭代一个单独的键元组。您必须手动维护该元组。

relevant_keys = ('name', 'occupation', 'age')
data = {'occupation': 'engineer', 'age': 27, 'name': 'satendra'}
list_of_tuples = [(key, data[key]) for key in relevant_keys]
print(list_of_tuples)
#  [('name', 'satendra'), ('occupation', 'engineer'), ('age', 27)]

【讨论】:

  • 谢谢@DeepSpace 我知道json对象是无序的,保持它的顺序没有意义,我只是好奇它是否可以做到。
  • @Satendra :是的,它可以做到,正如我在我的答案下面评论的那样,但你必须幸运地以所需的顺序打包 JSON。如果提供它的服务器非常有礼貌地为您做,您可以解析它并保持原始顺序。否则,尝试它是没有意义的。问题是,服务器没有理由向您发送有序的 JSON。 :D
【解决方案2】:

按照 cmets 中的建议使用 OrderedDict(),但正确:

from collections import OrderedDict

d = OrderedDict([('name', 'satendra'), ('occupation', 'engineer'), ('age', 27)])

您可以按照您希望的输出来定义它。然后你可以像使用普通字典一样使用它。

当您想要返回元组列表时,您可以这样做:

t = d.items()

当您知道预期的键并且您不能使用 OrderedDict() 时,您可以使用此解决方案:

def sortdict (d, keys=["name", "occupation"]):
    mx = len(keys)
    def customsortkey (key):
        try: return keys.index(key)
        except: return mx
    kys = sorted(d, key=customsortkey)
    return [(key, d[key]) for key in kys]

此函数将根据“keys”列表设置的顺序对输入字典“d”中的所有内容进行排序。字典中的任何项目,如果它的键不存在于列表“键”中,将以任意顺序放置到输出的末尾。您可以指出字典中不存在的键, 输出将是您需要的元组(键、值)列表。

这是一种可能的解决方案,但远非理想。 IE。我们可以开始讨论它的效率和开销。但实际上,它实际上可以正常工作,并且可以很好地处理任何意外的键。 此函数的更有效版本是使用字典来表示键的顺序而不是列表。一个字典,其中键的键和其值的排序索引。 像这样:

def sortdict (d, keys={"name": 0, "occupation": 1}):
    mx = len(keys)
    kys = sorted(d, key=lambda k: keys.get(k, mx))
    return [(key, d[key]) for key in kys]

【讨论】:

  • 阅读 cmets。 OP 无法控制字典的创建,因为它是来自 API 的响应。
  • 在我输入答案时收到了评论。我会建议一个解决方案,但您已经概述了它。如果不知道当前的密钥,除了编写您自己的 JSON 解析器并希望服务器将按所需顺序发送构造的 JSON 之外,没有其他可能。这不太可能。
  • 给你@DeepSpace,我想你会喜欢我的编辑的。
【解决方案3】:

MyDict = {'name': 'satendra', '职业': '工程师', '年龄': 27}

我的列表 = []

MyDict 中的键:

MyList.append( (key,MyDict[key]) )

现在 MyList 是一个元组列表。

【讨论】:

  • 但是由于dicts 是无序的,所以没有保留顺序。
  • 运行几次,你会发现这不是有序的。
  • 这是一个糟糕的答案,因为根据定义 dict 是无序的
猜你喜欢
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 2020-04-08
  • 2018-02-08
  • 2021-12-09
  • 2011-04-03
相关资源
最近更新 更多