Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用特定键附加字典的最具Python风格的方法_Python_Python 2.7_Dictionary - Fatal编程技术网

使用特定键附加字典的最具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未订购。他们是如何提升的?请你解释一下好吗?你是说钥匙在继续?如果你是