Python 将dict转换为元组保留顺序

Python 将dict转换为元组保留顺序,python,dictionary,Python,Dictionary,我有一本字典,这是一个例子,它可以有任意数量的字段 {'name': 'satendra', 'occupation': 'engineer', 'age': 27} 如何将其转换为元组,以便生成元组的有序列表 # Expected output [('name', 'satendra'), ('occupation', 'engineer'), ('age', 27)] 更新 当传递给它的元组的有序列表不是JSON对象时,OrderedDict很有用,所以我猜这不是重复的MyDict={'

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

{'name': 'satendra', 'occupation': 'engineer', 'age': 27}
如何将其转换为元组,以便生成元组的有序列表

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


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

MyDict={'name':'satendra','occulation':'engineer','age':27}

MyList=[]

对于MyDict中的密钥:

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

现在,我的列表是一个元组列表。

正如您已经从注释中理解的,没有顺序可以保留,因为没有顺序可以开始。此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)]
按照注释中的建议使用OrderedDict(),但正确:

from collections import OrderedDict

d = OrderedDict([('name', 'satendra'), ('occupation', 'engineer'), ('age', 27)])
您可以按照您希望的输出来定义它。然后你像使用普通字典一样使用它

当您想要返回元组列表时,可以执行以下操作:

t = d.items()
如果您知道需要哪些密钥,但无法使用OrderedDict(),则可以使用此解决方案:

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

这是一种可能的解决办法,但远远不够理想。也就是说,我们可以开始讨论它的效率和开销。但实际上,在实践中,它可以很好地工作,并且可以很好地处理任何意外的键。 该函数更有效的版本是使用字典来表示键的顺序,而不是列表。一种字典,其中有一个键对应有问题的键,其值对应排序索引。 像这样:

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]

按顺序是指保留键、值对吗?如果
name
键是我的dict中的第一个字段,那么当我将其转换为tupleUse
orderedict
时,它也应该排在第一位,这本质上是一个元组列表。@Satendra当然。首先需要使用
OrderedDict
。JSON对象也是无序的。钥匙根本没有顺序;没有什么可保留的。“”。但由于
dict
s是无序的,因此没有保留顺序。运行几次,您将看到这不是有序的。这是一个错误的答案,因为根据定义,dict是无序的。请阅读注释。OP无法控制字典的创建,因为它是来自API的响应。在我键入答案时,出现了注释。我会提出一个解决方案,但你已经概述了。如果不知道当前的密钥,那么除了编写自己的JSON解析器并希望服务器按照要求的顺序发送构建的JSON之外,没有其他可能。这不太可能。给你@DeepSpace,我想你会喜欢我的编辑。谢谢@DeepSpace,我知道json对象是无序的,没有保留其顺序的意义,我只是好奇它是否可以做到。@Satendra:是的,可以做到,正如我在下面的回答中所评论的,但是您必须幸运地按照所需的顺序打包JSON。如果提供它的服务器很有礼貌地为您这样做,您可以解析它并保持原始顺序。否则,尝试是没有意义的。问题是,服务器没有理由向您发送有序的JSOND
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]