[英]Adding key-value pairs to a dictionary in an ascending order
假设我有一个重复单词列表:
["Apple", "Orange", "Grape", "Orange", "Watermelon", "Apple", "Grape"]
我需要将它们放入字典中,以便每个单词按升序具有自己的键:
{1 : "Apple", 2 : "Orange", 3 : "Grape", 4: "Watermelon"}
顺序基于哪个单词首先出现。 如果“ Apple”首先出现,它将具有键1
;如果将来出现“ Apple”,则它将被忽略,因为“ Apple”已经包含在1中。如果“ Orange”出现在“ Apple”之后,它将有钥匙2
。 因此,键值对以升序添加。
我在添加和检查重复项方面没有问题,但是我一直在努力按升序排列键。 有什么线索吗?
如果您不介意导入:
>>> from collections import OrderedDict
>>> s = ["Apple", "Orange", "Grape", "Orange", "Watermelon", "Apple", "Grape"]
>>> dict(enumerate(OrderedDict.fromkeys(s), 1))
{1: 'Apple', 2: 'Orange', 3: 'Grape', 4: 'Watermelon'}
之所以有效,是因为OrderedDict.fromkeys
了一个有序字典,其中该顺序是插入顺序:
>>> OrderedDict.fromkeys(s)
OrderedDict([('Apple', None), ('Orange', None), ('Grape', None), ('Watermelon', None)])
只需维护一个索引,然后对照字典的值检查每个水果即可。
fruits = ["Apple", "Orange", "Grape", "Orange", "Watermelon", "Apple", "Grape"]
d = {}
index = 1
for fruit in fruits:
if fruit not in d.values():
d[index] = fruit
index += 1
会给你:
>>> d
{1: 'Apple', 2: 'Orange', 3: 'Grape', 4: 'Watermelon'}
您可以将list
转换为一set
,以消除多余的条目,但会丢失初始列表顺序:
fruit = set(["Apple", "Orange", "Grape", "Orange", "Watermelon", "Apple", "Grape"])
对象fruit
变为:
{'Apple', 'Grape', 'Orange', 'Watermelon'}
对于这样的情况,我发现使迭代索引从1开始更容易。 如果您想在将水果分配给字典中的数字键之前对其进行排序,则需要对您的水果集应用sorted()
函数以进行字母排序(您还可以设置参数以使用其他方式进行排序) sorted()
函数)。
basket = {}
for i, item in enumerate(sorted(fruit), start=1):
basket[i] = item
print basket
打印结果:
{1: 'Apple', 2: 'Grape', 3: 'Orange', 4: 'Watermelon'}
讨论后在评论中编辑:
检查字典中是否存在键的pythonic方法:
fruits = ['Apple', 'Orange', 'Grape', 'Orange', 'Watermelon', 'Apple', 'Grape']
index = 1
basket = {}
for fruit in fruits:
if fruit not in basket:
basket[fruit] = index
index = index + 1
fruits = ["Apple", "Orange", "Grape", "Orange", "Watermelon", "Apple", "Grape"]
basket = []
for i in range(len(fruits)):
if fruit[i] not in basket:
basket.append(fruit)
这不会给您带来字典,但是没关系,因为可以用相同的方式访问元素: basket[2] == "Grape"
任一种方式,假设您纠正了所需的dict时将数组索引为0的情况。布局是1索引的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.