0

我有一个嵌套的有序字典,即一个有序字典,其中一些值是包含进一步有序字典的有序字典。当我使用集合模块并使用以下调用时

yOrDict = yaml_ordered_dict.load('ApplyForm.yml')

yOrDict然后我从 yml 文件中得到一个有序的字典ApplyForm.yml

假设 yOrDict 只有一个键 ( ApplyForm) 和一个值,而该值又是一个有序字典。

进一步调用给出另一个有序字典:

yOrDictLevel1 = yOrDict.get('ApplyForm')

假设yOrDictLevel1有六个键,其值包含有序字典。

说在某个地方,一个有序字典有一个名为 的值Block

python中是否有一个调用/函数/方法,我可以通过它检查Block是否出现在顶级有序字典中- yOrDict?即我想检查 yOr​​Dict 中是否存在字符串“Block”?

4

2 回答 2

1

这应该可以解决问题。

def find_value(needle, container):
    # Already found the object. Return.
    if needle == container:
        return True

    values = None
    if isinstance(container, dict):
        values = container.values()
    elif hasattr(container, '__iter__'):
        values = container.__iter__()

    if values is None:
        return False

    # Check deeper in the container, if needed.
    for val in values:
        if find_value(needle, val):
            return True

    # No match found.
    return False

用法:

In [3]: d = { 'test': ['a', 'b', 'c'], 'd1': { 'd2': 'Block', 'a': 'b'} }

In [4]: find_value('Block', d)
Out[4]: True

编辑:测试一个值是否包含needle

def find_value(needle, container):
    # Already found the object. Return.
    if isinstance(container, basestring) and needle in container:
        return True

    values = None
    if isinstance(container, dict):
        values = container.values()
    elif hasattr(container, '__iter__'):
        values = container.__iter__()

    if values is None:
        return False

    # Check deeper in the container, if needed.
    for val in values:
        if find_value(needle, val):
            return True

    # No match found.
    return False
于 2013-07-24T18:17:45.940 回答
0
if "Block" in yOrDict.get('ApplyForm').values():
    print "Found Block value"

它不是更高级别的元字典的明确方法,因为它执行获取并搜索值,但它简洁并且可以解决问题。

编辑对您的评论的回复

if (("Beijing" in val) for key,val in yOrDict.get('ApplyForm')iteritems()):
    print "Found Beijing"
于 2013-07-24T18:20:09.727 回答