大多数pythonic方式用特定键附加Dictionary

时间:2017-01-12 22:15:17

标签: python python-2.7 dictionary

Dict = {'Key_1': 'Data_1', 'Key_2': 'Data_2', ..., 'Key_n': 'Data_n'}这样的字典包含按升序命名的n个键。

AddNextKey(Dict, NewData)之类的方法应确定最后一个密钥n并添加一个值为n+1的新NewData。 如果Dict为空,则该方法应附加键Key_1

我非常确定pythonic解决方案不需要超过两行或三行代码来实现这一目标。

备注:字典的排序并不重要。只能附加正确的下一个键(n + 1)。

有人可以提供建议吗?

7 个答案:

答案 0 :(得分:2)

我不确定它是否是最Pythonic解决方案,但我的方法是继承dict并添加其他方法。由于它是一个子类,因此您可以在实际NextKeyDict的任何位置使用dict的实例,但也可以根据需要执行这些特殊操作。

class NextKeyDict(dict):
    def add_next_key(self, new_data):
        if not self.keys():
            self[0] = new_data
            return

        last_key = sorted(self.keys())[-1]
        new_key = last_key + 1
        self[new_key] = new_data

d = NextKeyDict()
d.add_next_key('foo')
d.add_next_key('bar')
d.add_next_key('baz')
print(d)

<强>输出

{0: 'foo', 1: 'bar', 2: 'baz'}

答案 1 :(得分:1)

您可以使用字典的长度

Dict = dict()
for i in range(10):
    Dict['key_' + str(len(Dict)+1)] = 'value_'+str(len(Dict)+1)
print Dict

输出

{'key_10': 'value_10', 'key_5': 'value_5', 'key_4': 'value_4', 'key_7': 'value_7', 'key_6': 'value_6', 'key_1': 'value_1', 'key_3': 'value_3', 'key_2': 'value_2', 'key_9': 'value_9', 'key_8': 'value_8'}

答案 2 :(得分:1)

字典中没有顺序。并且你无法从中获取最后插入的元素。

看一下这个例子:

>>> {'Key_1': 'Data_1', 'Key_2': 'Data_2'} == {'Key_2': 'Data_2', 'Key_1': 'Data_1'}
True

如您所见,订单对dict无意义。

问题是你的最后一个关键字n究竟是什么意思。最后插入?或者有最大的key_%指数%?在第一种情况下,您最好使用OrderedDict,如前所述。

但是,如果我帮你,那么这是我的解决方案。

def AddNextKey(Dict, NewData):
    Dict['Key_%d' % (len(Dict) + 1)] = NewData

d = {}
AddNextKey(d, 'Data_1')
AddNextKey(d, 'Data_2')
AddNextKey(d, 'Data_3')

print d

你会得到

{'Key_1': 'Data_1', 'Key_3': 'Data_3', 'Key_2': 'Data_2'}

答案 3 :(得分:1)

普通的Python词典是无序的。所以在技术上,没有&#34;最后&#34;键。

但是有一种解决方法。您可以使用dict方法查看字典中有多少项,并根据该项构建下一个键。

但请注意,此方法脆弱。如果你不小心添加了密钥&#39; foo&#39;在字典里,你的整个计划都已关闭。

真的修复此问题,您必须创建__setitem__的子类(通过覆盖update'Key_N'方法,如{{3}所示})以便它只接受append形式的有效密钥。然后,您还可以添加{{1}}方法来自动创建下一个密钥。

但正如turbulencetoo评论的那样,使用列表可能会更容易。

答案 4 :(得分:0)

# set-up the dictionary for demo purposes
testdict = {x:y for x,y in zip(["Key_"+str(x) for x in range(1,7)],
                               ["Data_"+str(x) for x in range(1,7)])}

# fetch most recent key
# add 1 to recent_key_val and insert new value
if len(testdict) != 0:
    recent_key_val = max([int(x.split("_")[1]) for x in testdict])
    testdict["Key_"+str(recent_key_val +1)] = "New_Data"
else:
    testdict["Key_1"] = "New_Data"

答案 5 :(得分:0)

你需要的东西已经内置到Python中。所以我认为最pythonic的方法是使用OrderedDict。 正如docs所说

  

返回一个dict子类的实例,支持通常的dict方法。 OrderedDict是一个dict,它记住了第一次插入键的顺序。如果新条目覆盖现有条目,则原始插入位置保持不变。删除一个条目并重新插入它将把它移到最后。

from collections import OrderedDict
d = OrderedDict()
d["Key1"] = 1
d["Key2"] = 2
d["Key3"] = 3

last_key = d.keys()[-1]  # "Key3" thanks to ordering
new_key = calculate_new_key(last_key)
d[new_key] = new_value

答案 6 :(得分:0)

根据定义,python字典是一组无序的键:值对,要求键是唯一的。 鉴于您可以使用类集合中的OrderedDict来创建和更新字典并保留顺序。

from collections import OrderedDict
d1 = OrderedDict([(1, 'Data_1'), (2, 'Data_2'),(3, 'Data_3')])

你得到了

OrderedDict([(1, 'Data_1'), (2, 'Data_2'), (3, 'Data_3')])

现在更新字典的方法

def AddNextKey(Dict, NewData):
    last_key = next(reversed(Dict))
    new_key = last_key + 1
    Dict.update({new_key: NewData})

致电时

AddNextKey(d1, 'Blah')

你得到了

OrderedDict([(1, 'Data_1'), (2, 'Data_2'), (3, 'Data_3'), (4, 'Blah')])