dict.items()和之间是否有任何适用的差异dict.iteritems()?
从Python文档:
dict.items():返回字典的(键,值)对列表的副本.
dict.iteritems():在字典(键,值)对上返回一个迭代器.
如果我运行下面的代码,每个似乎都返回对同一对象的引用.我缺少哪些微妙的差异?
#!/usr/bin/python
d={1:'one',2:'two',3:'three'}
print 'd.items():'
for k,v in d.items():
if d[k] is v: print '\tthey are the same object'
else: print '\tthey are different'
print 'd.iteritems():'
for k,v in d.iteritems():
if d[k] is v: print '\tthey are the same object'
else: print '\tthey are different'
Run Code Online (Sandbox Code Playgroud)
输出:
d.items():
they are the same object
they are the same object
they are the same object
d.iteritems():
they are the same …Run Code Online (Sandbox Code Playgroud) 我发现访问dict密钥更加方便,obj.foo而不是obj['foo'],所以我写了这个代码片段:
class AttributeDict(dict):
def __getattr__(self, attr):
return self[attr]
def __setattr__(self, attr, value):
self[attr] = value
Run Code Online (Sandbox Code Playgroud)
但是,我认为必须有一些原因,Python不提供开箱即用的功能.以这种方式访问dict密钥有什么警告和陷阱?
我想使用Python将JSON数据转换为Python对象.
我从Facebook API接收JSON数据对象,我想将其存储在我的数据库中.
我目前在Django中查看(Python)(request.POST包含JSON):
response = request.POST
user = FbApiUser(user_id = response['id'])
user.name = response['name']
user.username = response['username']
user.save()
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我如何处理复杂的JSON数据对象?
如果我能以某种方式将这个JSON对象转换为Python对象以便于使用,那会不会更好?
如何通过点"."访问Python字典成员?
例如,mydict['val']我不想写作,而是写作mydict.val.
此外,我想以这种方式访问嵌套的dicts.例如
mydict.mydict2.val
Run Code Online (Sandbox Code Playgroud)
会参考
mydict = { 'mydict2': { 'val': ... } }
Run Code Online (Sandbox Code Playgroud) 目标是创建一个类似于db结果集的模拟类.
因此,例如,如果数据库查询使用dict表达式返回{'ab':100, 'cd':200},那么我想看到:
>>> dummy.ab
100
Run Code Online (Sandbox Code Playgroud)
起初我想也许我可以这样做:
ks = ['ab', 'cd']
vs = [12, 34]
class C(dict):
def __init__(self, ks, vs):
for i, k in enumerate(ks):
self[k] = vs[i]
setattr(self, k, property(lambda x: vs[i], self.fn_readyonly))
def fn_readonly(self, v)
raise "It is ready only"
if __name__ == "__main__":
c = C(ks, vs)
print c.ab
Run Code Online (Sandbox Code Playgroud)
但是c.ab返回一个属性对象.
更换setattr线路k = property(lambda x: vs[i])完全没用.
那么在运行时创建实例属性的正确方法是什么?
如何解析/读取YAML文件到Python对象?
例如,这个YAML:
Person:
name: XYZ
Run Code Online (Sandbox Code Playgroud)
对于这个Python类:
class Person(yaml.YAMLObject):
yaml_tag = 'Person'
def __init__(self, name):
self.name = name
Run Code Online (Sandbox Code Playgroud)
我顺便使用PyYAML.
我有一个只包含字段而没有方法的类,如下所示:
class Request(object):
def __init__(self, environ):
self.environ = environ
self.request_method = environ.get('REQUEST_METHOD', None)
self.url_scheme = environ.get('wsgi.url_scheme', None)
self.request_uri = wsgiref.util.request_uri(environ)
self.path = environ.get('PATH_INFO', None)
# ...
Run Code Online (Sandbox Code Playgroud)
这很容易被翻译成一个字典.该课程对于未来的添加更加灵活,可以快速使用__slots__.那么使用dict会有好处吗?一个dict会比一个班级快吗?比带插槽的课程更快?
我是YAML的新手,一直在寻找解析YAML文件和使用/访问解析后的YAML数据的方法.
我遇到了关于如何解析YAML文件的解释,例如,PyYAML 教程," 我如何在Python中解析YAML文件 "," 将Python dict转换为对象? ",但我没有找到的是关于如何从解析的YAML文件访问数据的简单示例.
假设我有一个YAML文件,例如:
treeroot:
branch1: branch1 text
branch2: branch2 text
Run Code Online (Sandbox Code Playgroud)
如何访问"branch1 text"文本?
" YAML解析和Python? "提供了一个解决方案,但是我在从更复杂的YAML文件访问数据时遇到了问题.而且,我想知道是否有一些标准的方法从解析的YAML文件访问数据,可能类似于" 树迭代 "或" 元素路径 "符号或解析XML文件时将使用的东西?
我是python的新手,我希望我能用.符号来访问a的值dict.
让我们说我test喜欢这样:
>>> test = dict()
>>> test['name'] = 'value'
>>> print(test['name'])
value
Run Code Online (Sandbox Code Playgroud)
但是,我希望我能做到test.name让value.事实上,我通过覆盖__getattr__我的类中的方法来做到这一点:
class JuspayObject:
def __init__(self,response):
self.__dict__['_response'] = response
def __getattr__(self,key):
try:
return self._response[key]
except KeyError,err:
sys.stderr.write('Sorry no key matches')
Run Code Online (Sandbox Code Playgroud)
这很有效!当我做:
test.name // I get value.
Run Code Online (Sandbox Code Playgroud)
但问题是当我test单独打印时,我得到的错误是:
'Sorry no key matches'
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
有时将相关数据聚集在一起是有意义的.我倾向于用dict这样做,例如,
self.group = dict(a=1, b=2, c=3)
print self.group['a']
Run Code Online (Sandbox Code Playgroud)
我的一位同事更喜欢创建一个班级
class groupClass(object):
def __init__(a, b, c):
self.a = a
self.b = b
self.c = c
self.group = groupClass(1, 2, 3)
print self.group.a
Run Code Online (Sandbox Code Playgroud)
请注意,我们没有定义任何类方法.
我喜欢使用dict,因为我喜欢最小化代码行数.我的同事认为如果使用类,代码更具可读性,并且将来更容易向类中添加方法.
你更喜欢哪个?为什么?
python ×10
dictionary ×6
class ×2
nested ×2
parsing ×2
syntax ×2
yaml ×2
django ×1
json ×1
oop ×1
properties ×1
python-2.x ×1
runtime ×1
struct ×1
xml ×1