将键值对插入字典的指定位置

2024-05-28 05:41:32 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在从YAML文档加载的python字典中的指定位置插入键值对?

例如,如果字典是:

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}

我想插入元素'Phone':'1234'

年龄之前,在姓名之后。这只是一个例子。我将要处理的实际字典相当大(已解析的YAML文件),因此删除和重新插入可能有点麻烦(我不太清楚)。

如果给我一种方法,插入到一个指定的位置,在一个有序的信息技术,这也可以。


Tags: name文档元素yamlage字典phonedict
3条回答

一旦您使用了load()(没有选项Loader=RoundTripLoader),并且您的数据位于dict()中,就要迟到了,因为在YAML文件中可用的顺序通常已经消失(顺序取决于使用的实际键、使用的python(实现、版本和可能的编译选项)。

你需要做的是使用round_trip_load()

import sys
from ruamel import yaml

yaml_str = "{'Name': 'Zara', 'Age': 7, 'Class': 'First'}"

data = yaml.round_trip_load(yaml_str)
pos = list(data.keys()).index('Age')  # determine position of 'Age'
# insert before position of 'Age'
data.insert(pos, 'Phone', '1234', comment='This is the phone number')
data.fa.set_block_style()   # I like block style
yaml.round_trip_dump(data, sys.stdout)

这将始终给予:

Name: Zara
Phone: '1234'  # This is the phone number
Age: 7
Class: First

在引擎盖下round_trip_dump()透明地返回一个orderddict的子类来实现这一点(实际实现依赖于Python版本)。

在python<;3.7(或cpython<;3.6)上,您无法控制标准字典中对的顺序。

如果您计划经常执行任意插入,我的建议是使用列表存储键,使用dict存储值。

mykeys = ['Name', 'Age', 'Class']
mydict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'} # order doesn't matter

k, v = 'Phone', '123-456-7890'

mykeys.insert(mykeys.index('Name')+1, k)
mydict[k] = v

for k in mykeys:
    print(f'{k} => {mydict[k]}')

# Name => Zara
# Phone => 123-456-7890
# Age => 7
# Class => First

如果计划使用内容不太可能更改的顺序初始化词典,则可以使用维护插入顺序的collections.OrderedDict结构。

from collections import OrderedDict

data = [('Name', 'Zara'), ('Phone', '1234'), ('Age', 7), ('Class', 'First')] 
odict = OrderedDict(data)
odict
# OrderedDict([('Name', 'Zara'),
#              ('Phone', '1234'),
#              ('Age', 7),
#              ('Class', 'First')])

注意,OrderedDict不支持在任意位置插入(它只记住键插入字典的顺序)。

您必须将dict初始化为OrderedDict。创建一个新的空OrderedDict,遍历原始字典的所有键,并在键名匹配时插入before/after。

from pprint import pprint
from collections import OrderedDict


def insert_key_value(a_dict, key, pos_key, value):
    new_dict = OrderedDict()
    for k, v in a_dict.items():
        if k==pos_key:
            new_dict[key] = value  # insert new key
        new_dict[k] = v
    return new_dict


mydict = OrderedDict([('Name', 'Zara'), ('Age', 7), ('Class', 'First')])
my_new_dict = insert_key_value(mydict, "Phone", "Age", "1234")
pprint(my_new_dict)

相关问题 更多 >