将对象添加到字典的开头

Add object to start of dictionary

我正在制作一个群聊应用程序,并且我有与用户关联的图像,所以每当他们说些什么时,他们的图像就会显示在它旁边。我在 python 中编写了服务器,客户端将是一个 iOS 应用程序。我使用字典来存储所有 message/image 对。每当我的 iOS 应用程序向服务器 (msg:<message) 发送命令时,字典都会将图像和消息添加到字典中,如下所示:dictionary[message] = imageName,它被转换为列表,然后是字符串在套接字中发送。我想将传入的消息添加到字典的开头,而不是结尾。像

#When added to end:
dictionary = {"hello":image3.png}
#new message
dictionary = {"hello":image3.png, "i like py":image1.png}

#When added to start:
dictionary = {"hello":image3.png}
#new message
dictionary = {"i like py":image1.png, "hello":image3.png}

有没有办法将对象添加到字典的开头?

首先,它没有在字典的末尾添加项目,因为字典使用哈希-table 来存储它们的元素并且是无序的。如果你想保留你可以使用 collections.OrderedDict 的顺序,但它会将项目附加到你的字典的末尾。一种方法是将该项目附加到您的项目的拳头,然后将其转换为 Orderd:

>>> from collections import OrderedDict
>>> d=OrderedDict()
>>> for i,j in [(1,'a'),(2,'b')]:
...    d[i]=j
... 
>>> d
OrderedDict([(1, 'a'), (2, 'b')])
>>> d=OrderedDict([(3,'t')]+d.items())
>>> d
OrderedDict([(3, 't'), (1, 'a'), (2, 'b')])

另外一种有效的方法,如果不需要使用字典,您可以使用 deque 允许您从两侧追加:

>>> from collections import deque
>>> d=deque()
>>> d.append((1,'a'))
>>> d.append((4,'t'))
>>> d
deque([(1, 'a'), (4, 't')])
>>> d.appendleft((8,'p'))
>>> d
deque([(8, 'p'), (1, 'a'), (4, 't')])

我不确定字典是否是您数据的最佳数据结构,但您可能会发现有用 collections.OderedDict。它基本上是一个字典,以 FIFO 方式记住添加到字典中的键的顺序(这与您需要的相反)。

如果您想从最近的项目开始检索所有项目,您可以使用 reversed() 来反转字典迭代器。您还可以使用方法 popitem() 从字典中检索(并删除)您上次输入的键值对。

Link 到文档:https://docs.python.org/2/library/collections.html#collections.OrderedDict

正如其他人指出的那样,标准字典中没有 "order" 的概念。尽管您可以使用 OrderedDict 来添加排序行为,但这带来了其他考虑因素——与普通字典不同,它不是可移植的数据结构(例如转储到 JSON 然后重新加载不会保留顺序)- - 并且在 Python.

的所有版本的标准库中不可用

您最好在标准字典中使用顺序键——计数索引或时间戳——以保持简单。

正如其他人所指出的,字典中没有 "order"。但是,如果您像我一样只需要一个适合您目的的临时(/ hacky)解决方法。有一种方法可以做到这一点。

您可以迭代字典,并在迭代过程的开始追加项目。这似乎对我有用。

相关部分是声明new_fields的地方。我将其余内容包括在内。

userprofile_json = Path(__file__).parents[2] / f"data/seed-data/user-profile.json"

    with open(userprofile_json) as f:
        user_profiles = json.load(f)

    for user_profile in user_profiles:

        new_fields = {
            'user':  user_profile['fields']['username'],
        }
        for k, v in user_profile['fields'].items():
            new_fields[k] = v

        user_profile['fields'] = new_fields


    with open(userprofile_json, 'w') as f:
        json.dump(user_profiles, f, indent=4)

对于所描述的用例,听起来元组列表是更好的数据结构。

但是,从 Python 3.7 开始就可以订购字典了。 Dictionaries are now ordered by insertion order.

要在字典末尾以外的任何位置添加元素,您需要 re-create 字典并按顺序插入元素。如果您想将条目添加到字典的开头,这非常简单。

# Existing data structure
old_dictionary = {"hello": "image3.png"}

# Create a new dictionary with "I like py" at the start, then
# everything from the old data structure.
new_dictionary = {"i like py": "image1.png"}
new_dictionary.update(old_dictionary)

# new_dictionary is now:
# {'i like py': 'image1.png', 'hello': 'image3.png'}

(python3) geeksforgeeks.org

上来自 Manjeet 的好例子
test_dict = {"Gfg" : 5, "is" : 3, "best" : 10}  
updict = {"pre1" : 4, "pre2" : 8}

# ** operator for packing and unpacking items in order
res = {**updict, **test_dict}