使用特定键附加字典的最具Python风格的方法
像使用特定键附加字典的最具Python风格的方法,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,像Dict={'Key_1':'Data_1','Key_2':'Data_2',…,'Key_n':'Data_n'}这样的字典包含按升序命名的n键 像AddNextKey(Dict,NewData)这样的方法应该确定最后一个键n,并使用值NewData添加一个新键n+1。 如果Dict为空,则该方法应附加键key_1 我非常确信,pythonic解决方案不需要超过两行或三行代码来实现这一点 备注:订购词典并不重要。只需添加正确的下一个键(n+1) 有人能给你建议吗?你可以用字典的长度 Dic
Dict={'Key_1':'Data_1','Key_2':'Data_2',…,'Key_n':'Data_n'}
这样的字典包含按升序命名的n
键
像AddNextKey(Dict,NewData)
这样的方法应该确定最后一个键n
,并使用值NewData
添加一个新键n+1
。
如果Dict
为空,则该方法应附加键key_1
我非常确信,pythonic解决方案不需要超过两行或三行代码来实现这一点
备注:订购词典并不重要。只需添加正确的下一个键(n+1)
有人能给你建议吗?你可以用字典的长度
Dict = dict()
for i in range(10):
Dict['key_' + str(len(Dict)+1)] = 'value_'+str(len(Dict)+1)
print Dict
def AddNextKey(Dict, NewData):
last_key = next(reversed(Dict))
new_key = last_key + 1
Dict.update({new_key: NewData})
输出
{'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'}
你可以用字典的长度
Dict = dict()
for i in range(10):
Dict['key_' + str(len(Dict)+1)] = 'value_'+str(len(Dict)+1)
print Dict
def AddNextKey(Dict, NewData):
last_key = next(reversed(Dict))
new_key = last_key + 1
Dict.update({new_key: NewData})
输出
{'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'}
我不确定它是否是最具python风格的解决方案,但我的方法是将
dict
子类化并添加额外的方法。由于它是一个子类,您可以在任何可以使用实际的dict
的地方使用NextKeyDict
的实例,但也可以在需要时执行这些特殊操作
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'}
我不确定它是否是最具python风格的解决方案,但我的方法是将
dict
子类化并添加额外的方法。由于它是一个子类,您可以在任何可以使用实际的dict
的地方使用NextKeyDict
的实例,但也可以在需要时执行这些特殊操作
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'}
Python中已经内置了您需要的东西。所以我认为最适合的方法是使用OrderedDict。 俗话说 返回dict子类的实例,支持常用的dict方法。OrderedDict是一种记录键首次插入顺序的dict。如果新条目覆盖现有条目,则原始插入位置保持不变。删除条目并重新插入会将其移动到末尾
Python中已经内置了您需要的东西。所以我认为最适合的方法是使用OrderedDict。 俗话说 返回dict子类的实例,支持常用的dict方法。OrderedDict是一种记录键首次插入顺序的dict。如果新条目覆盖现有条目,则原始插入位置保持不变。删除条目并重新插入会将其移动到末尾
根据定义,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')])
OrderedDict([(1, 'Data_1'), (2, 'Data_2'), (3, 'Data_3'), (4, 'Blah')])
现在是更新字典的方法
Dict = dict()
for i in range(10):
Dict['key_' + str(len(Dict)+1)] = 'value_'+str(len(Dict)+1)
print Dict
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')])
OrderedDict([(1, 'Data_1'), (2, 'Data_2'), (3, 'Data_3'), (4, 'Blah')])
根据定义,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')])
OrderedDict([(1, 'Data_1'), (2, 'Data_2'), (3, 'Data_3'), (4, 'Blah')])
现在是更新字典的方法
Dict = dict()
for i in range(10):
Dict['key_' + str(len(Dict)+1)] = 'value_'+str(len(Dict)+1)
print Dict
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')])
OrderedDict([(1, 'Data_1'), (2, 'Data_2'), (3, 'Data_3'), (4, 'Blah')])
字典里没有顺序。您无法从中获取最后插入的元素 看看这个例子:
>>> {'Key_1': 'Data_1', 'Key_2': 'Data_2'} == {'Key_2': 'Data_2', 'Key_1': 'Data_1'}
True
正如您所看到的,顺序对于dict
来说毫无意义
问题是你所说的最后一个键n到底是什么意思。最后一次插入?或者使用最大键%index%?如前所述,在第一种情况下,您最好使用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'}
字典里没有顺序。您无法从中获取最后插入的元素 看看这个例子:
>>> {'Key_1': 'Data_1', 'Key_2': 'Data_2'} == {'Key_2': 'Data_2', 'Key_1': 'Data_1'}
True
正如您所看到的,顺序对于dict
来说毫无意义
问题是你所说的最后一个键n到底是什么意思。最后一次插入?或者使用最大键%index%?如前所述,在第一种情况下,您最好使用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'}
普通Python字典是无序的。所以从技术上讲,没有“最后”键 但是有一种方法可以解决这个问题。您可以使用
len
方法查看字典中有多少项,并在此基础上构造下一个键
但请注意,这种方法是脆弱的。如果您不小心将一个键“foo”添加到字典中,则整个方案将关闭
要真正解决此问题,您必须创建dict
的子类(通过覆盖\uuuu setitem\uuuuuu
和update
方法,如中所示),以便它只接受格式为'Key\N'
的有效键。然后还可以添加一个append
方法来自动创建下一个键
但是正如turbulencetoo评论的那样,使用列表可能更容易。普通Python字典是无序的。所以从技术上讲,没有“最后”键 但是有一种方法可以解决这个问题。您可以使用
len
方法查看字典中有多少项,并在此基础上构造下一个键
但请注意,这种方法是脆弱的。如果您不小心将一个键“foo”添加到字典中,则整个方案将关闭
要真正解决此问题,您必须创建dict
的子类(通过覆盖\uuuu setitem\uuuuuu
和update
方法,如中所示),以便它只接受格式为'Key\N'
的有效键。然后还可以添加一个append
方法来自动创建下一个键
但是正如turbulencetoo评论的那样,使用列表可能会更容易。如果您的键以数字方式上升,那么为什么不使用列表,并附加到列表的末尾?您当前的解决方案是什么?它有什么不和谐的地方?什么?据我所知,
dict
s未订购。他们是如何提升的?请你解释一下好吗?你是说钥匙在继续?如果你是