我有一个列表和字典的可变字典,我试图迭代以找到一个特定的值 字典看起来像这样
list = { 'foo' : [1,2,3,4], 'bar' : { 'something' : 'value', 'something else' : 'value' }, 'anotherlist' : [5,6,7,8]}
这个的确切结构是可变的,可以是列表,字典,嵌套或两者。我无法提前知道它会是什么。
我知道我需要一台发电机,但我失败了。这是我尝试过的一段代码(不是我自己的)
def find(key, dictionary):
print dictionary
if key in dictionary:
yield key
for k, v in dictionary.iteritems():
if k == key:
yield v
elif isinstance(v, dict):
for result in find(key, v):
yield result
elif isinstance(v, list):
for d in v:
for result in find(key, d):
yield result
(我知道这是返回键,但我想我可以将其修改为值)
但我正在追随:
AttributeError: 'unicode' object has no attribute 'iteritems'
我试图修改它
def find(key, dictionary):
print dictionary
if key in dictionary:
yield key
if isinstance(dictionary, unicode):
yield key
for k, v in dictionary.iteritems():
if k == key:
yield v
elif isinstance(v, dict):
for result in find(key, v):
yield result
elif isinstance(v, list):
for d in v:
for result in find(key, d):
yield result
但这并没有帮助。
有什么建议吗?
答案 0 :(得分:1)
这里的问题似乎是传入dictionary
的{{1}}有时可能只是一个值,但甚至不是dict或列表的情况,并且抛出了这个错误:
find()
试试这个:
AttributeError: 'unicode' object has no attribute 'iteritems'
我用这个例子来测试:
def find(key, dictionary):
if isinstance(dictionary, dict) or isinstance(dictionary, list):
if key in dictionary:
yield key
for k, v in dictionary.iteritems():
if k == key:
yield v
elif isinstance(v, dict):
for result in find(key, v):
yield result
elif isinstance(v, list):
for d in v:
for result in find(key, d):
yield result
else:
if key == dictionary:
yield key
我不确定你想在这里做到什么,但这是我猜的起点。