像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)。
有人可以提供建议吗?
答案 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')])