假设你有一个字典,如:
{'a': 1,
'c': {'a': 2,
'b': {'x': 5,
'y' : 10}},
'd': [1, 2, 3]}
Run Code Online (Sandbox Code Playgroud)
你会如何将其扁平化为:
{'a': 1,
'c_a': 2,
'c_b_x': 5,
'c_b_y': 10,
'd': [1, 2, 3]}
Run Code Online (Sandbox Code Playgroud) 我有一个嵌套字典.是否只有一种方法可以安全地获得价值?
try:
example_dict['key1']['key2']
except KeyError:
pass
Run Code Online (Sandbox Code Playgroud)
或者python有一个像get()嵌套字典的方法?
很抱歉,如果之前已经回答过这个问题 - 我一直在寻找解决方案,但我可能没有使用正确的搜索字词.
无论如何,我要做的是在给定索引列表和值的情况下以编程方式在字典中设置值,可能是嵌套的.
例如,假设我的索引列表是:
['person', 'address', 'city']
Run Code Online (Sandbox Code Playgroud)
而且价值是
'New York'
Run Code Online (Sandbox Code Playgroud)
我想要一个字典对象,如:
{ 'Person': { 'address': { 'city': 'New York' } }
Run Code Online (Sandbox Code Playgroud)
基本上,列表表示嵌套字典中的"路径".
我想我可以构建字典本身,但我磕磕绊绊的是如何设置值.显然,如果我只是手动编写代码,那将是:
dict['Person']['address']['city'] = 'New York'
Run Code Online (Sandbox Code Playgroud)
但是,如果我只有一个索引和值的列表,我如何索引到字典并以编程方式设置值?
希望这是有道理的,并不是一个愚蠢的问题... :)谢谢你的帮助.
假设我有一个像这样的多级字典
mydict = {
'first': {
'second': {
'third': {
'fourth': 'the end'
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想像这样访问它
test = get_entry(mydict, 'first.second.third.fourth')
Run Code Online (Sandbox Code Playgroud)
到目前为止我所拥有的是什么
def get_entry(dict, keyspec):
keys = keyspec.split('.')
result = dict[keys[0]]
for key in keys[1:]:
result = dict[key]
return result
Run Code Online (Sandbox Code Playgroud)
有更有效的方法吗?根据%timeit,函数的运行时间是1.26us,而访问字典的标准方式是这样的
foo = mydict['first']['second']['third']['fourth']
Run Code Online (Sandbox Code Playgroud)
需要541ns.如果可能的话,我正在寻找将其修剪到800ns范围的方法.
谢谢
这可能是一个简单的问题,所以希望有人能够轻易指出我的错误或者这是否可能.
我有一个具有多个对象作为属性的对象.我希望能够动态设置这些对象的属性,如下所示:
class Person(object):
def __init__(self):
self.pet = Pet()
self.residence = Residence()
class Pet(object):
def __init__(self,name='Fido',species='Dog'):
self.name = name
self.species = species
class Residence(object):
def __init__(self,type='House',sqft=None):
self.type = type
self.sqft=sqft
if __name__=='__main__':
p=Person()
setattr(p,'pet.name','Sparky')
setattr(p,'residence.type','Apartment')
print p.__dict__
Run Code Online (Sandbox Code Playgroud)
输出是:
{'pet':< main .Pet对象位于0x10c5ec050>,'住所':< main .Residence对象位于0x10c5ec0d0>,'pet.name':'Sparky','residence.type':'公寓'}
如您所见,不是在人的宠物对象上设置name属性,而是创建一个新属性"pet.name".
我无法将person.pet指定为setattr,因为不同的子对象将通过相同的方法设置,即解析某些文本并在找到相关键时填写对象属性.
有没有简单/内置的方法来实现这一目标?
或者我可能需要编写一个递归函数来解析字符串并多次调用getattr,直到找到必要的子对象,然后在找到的对象上调用setattr?
谢谢!
我正在构建一些Python代码来读取和操作深层嵌套的dicts(最终用于与JSON服务进行交互,但是出于其他目的它会很棒)我正在寻找一种方法来轻松读取/设置/更新内部值dict,不需要很多代码.
@see还有Python:通过属性递归访问dict以及索引访问? - Curt Hagenlocher的"DotDictify"解决方案非常有说服力.我也喜欢Ben Alman在http://benalman.com/projects/jquery-getobject-plugin/中为JavaScript提供的内容. 将两者结合起来会很棒.
在Curt Hagenlocher和Ben Alman的例子的基础上,拥有如下功能的Python会很棒:
>>> my_obj = DotDictify()
>>> my_obj.a.b.c = {'d':1, 'e':2}
>>> print my_obj
{'a': {'b': {'c': {'d': 1, 'e': 2}}}}
>>> print my_obj.a.b.c.d
1
>>> print my_obj.a.b.c.x
None
>>> print my_obj.a.b.c.d.x
None
>>> print my_obj.a.b.c.d.x.y.z
None
Run Code Online (Sandbox Code Playgroud)
知道这是否可行,如果可行,如何修改DotDictify解决方案?
或者,可以使get方法接受点符号(并添加补充集方法)但是对象符号确定更清晰.
>>> my_obj = DotDictify()
>>> my_obj.set('a.b.c', {'d':1, 'e':2})
>>> print my_obj
{'a': {'b': {'c': {'d': 1, 'e': 2}}}}
>>> print my_obj.get('a.b.c.d')
1
>>> print my_obj.get('a.b.c.x')
None
>>> print my_obj.get('a.b.c.d.x')
None …Run Code Online (Sandbox Code Playgroud) 我想以编程方式访问字典.我知道如何使用递归函数执行此操作,但有更简单的方法吗?
example = {'a': {'b': 'c'},
'1': {'2': {'3': {'4': '5'}}}}
keys = ('a', 'b')
example[keys] = 'new'
# Now it should be
# example = {'a': {'b': 'new'},
# '1': {'2': {'3': {'4': '5'}}}}
keys = ('1', '2', '3', '4')
example[keys] = 'foo'
# Now it should be
# example = {'a': {'b': 'new'},
# '1': {'2': {'3': {'4': 'foo'}}}}
keys = ('1', '2')
example[keys] = 'bar'
# Now it should be
# example = {'a': {'b': 'new'},
# …Run Code Online (Sandbox Code Playgroud) 如果我有一个元素,我试图从字典中获取:
my_dict[i]['level_1']['level_2']['my_var'].
有没有比这样做更清晰的方法来检查空值?
if 'level_1' in my_dict[i]:
if 'level_2' in my_dict[i]['level_1']:
if 'my_var' in my_dict[i]['level_1']['level_2']:
my_var = my_dict[i]['level_1']['level_2']['my_var']
Run Code Online (Sandbox Code Playgroud) 我正在使用API调用,因此使用Python字典.
但是,对于相同的请求,我并不总是键入相同的键,我想知道何时可以在没有异常的情况下调用键...
让我说我有
test = {'a':{'b':{'c':{'d':'e'}}}}
Run Code Online (Sandbox Code Playgroud)
有时密钥d会存在,有时则不会.有时c甚至不存在.
我想以某种方式test['a']['b']['c']['d']在一行中检查是否存在.
到目前为止我尝试过的:
用test.get('a', {}).get('b', {}).get('c', {}).get('d', {}).工作正常,但它是一个烂摊子,有时我有5-6个嵌套的词典,名字很长......
使用try/except块很好,但通常如果test['a']['b']['c']['d']不存在,我会尝试调用test['a']['b']['e']['f']检查是否存在,因此我需要为每个if语句添加一个try/catch,就好像我没有错,如果异常是catch,则不再执行try块.
我可能试图寻找一种反身的方式来做这件事,调用一个函数,将我的"对象"的名称作为字符串,检查每个键是否存在,如果存在,则返回对象本身.
有什么想法吗 ?
它背后的用法是,省略无用的情况,并假设有时信息在测试['a'] ['b'] ['c'] ['d'],有时在测试['a'] [' b'] ['f']:
if test['a']['b']['c']['d'] **exists**:
do sthg with the value of test['a']['b']['c']['d']
elif test['a']['b']['f'] **exists**:
do sthg else with the value of test['a']['b']['f']
else:
do sthg different
Run Code Online (Sandbox Code Playgroud)
如果我把try/except放在那里,第一个异常不会停止执行并且不让我执行elif吗?
而且,我真的很喜欢打电话的方式而test['a']['b']['c']['d']不是给出一个按键列表.事实上,我希望它对我和那些阅读/使用我的代码的人们尽可能透明.
谢谢 !
我有一个单词列表,我想将它们存储在嵌套字典中.
以下是样本清单: -
words = ['Apple','Ape','Bark','Barn']
Run Code Online (Sandbox Code Playgroud)
我要创建的字典如下: -
{'A':{'P':{'E':{},
'P':{'L':{'E':{}}}}},
'B':{'A':{'R':{'K':{},'N':{}}}}}
Run Code Online (Sandbox Code Playgroud)
这些词不区分大小写.
python ×10
dictionary ×6
python-2.7 ×2
python-3.x ×2
recursion ×2
attributes ×1
except ×1
json ×1
list ×1
lookup ×1
methods ×1
setattr ×1