在列表和词典中查找字符串

时间:2018-04-30 00:23:24

标签: python

我有一个列表和字典的可变字典,我试图迭代以找到一个特定的值 字典看起来像这样

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

但这并没有帮助。

有什么建议吗?

1 个答案:

答案 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

我不确定你想在这里做到什么,但这是我猜的起点。