迭代嵌套字典中的列表

时间:2016-02-12 04:29:13

标签: python dictionary

假设我有这样的字典:

myDict = {
    1: {
        "a": "something",
        "b": [0, 1, 2],
        "c": ["a", "b", "c"]
    },
    2: {
        "a": "somethingElse",
        "b": [3, 4, 5],
        "c": ["d", "e", "f"]
    },
    3: {
        "a": "another",
        "b": [6, 7, 8],
        "c": ["g", "h", "i"]
    }
}

这是我的代码:

for id, obj in myDict.items():
    for key, val in obj.items():
        if key is "b":
            for item in val:
                # apply some function to item

有没有更好的方法来迭代嵌套字典中的列表?或者有一种pythonic方式来做到这一点?

5 个答案:

答案 0 :(得分:2)

您绝对不需要迭代列表来打印它(除非这是您正在编写的代码的功能要求)。

很简单,你可以这样做:

for id, obj in myDict.items():
    if "b" in obj:
        print obj["b"]

要将列表对象(由obj['b']表示)映射到另一个函数,您可以使用map函数:

map(foo, obj["b"])   

答案 1 :(得分:1)

如果你的字典总是两层深,我认为你的方法没有任何问题。在您的实施中,我会使用key == "b"而不是key is "b"。使用is将测试身份(例如id(a) == id(b)),而==将测试相等性(例如a.__eq__(b))。当我在IDLE中测试它时,它的功能相同,但这并不是一个好习惯。这里有更多信息:How is the 'is' keyword implemented in Python?

如果您想处理不同级别的词典,可以使用以下内容:

def test_dict_for_key(dictionary, key, function):
    for test_key, value in dictionary.items():
        if key == test_key:
            dictionary[key] = type(value)(map(function, value))
        if isinstance(value, dict):
            test_dict_for_key(value, key, function)

示例用法可能类似于:

myDict = {
    1: {
        "a": "something",
        "b": [0, 1, 2],
        "c": ["a", "b", "c"]
    },
    2: {
        "a": "somethingElse",
        "b": [3, 4, 5],
        "c": ["d", "e", "f"]
    },
    3: {
        "a": "another",
        "b": [6, 7, 8],
        "c": ["g", "h", "i"]
    }
}

# adds 1 to every entry in each b
test_dict_for_key(myDict, "b", lambda x: x + 1)

# prints [1, 2, 3]
print(myDict[1]["b"])

答案 2 :(得分:1)

我是发电机表达的粉丝。

inner_lists = (inner_dict['b'] for inner_dict in myDict.values())
# if 'b' is not guaranteed to exist,
# replace inner_dict['b'] with inner_dict.get('b', [])
items = (item for ls in inner_lists for item in ls)

现在您可以使用foo循环

for item in items:
    # apply function

map

transformed_items = map(func, items)

答案 3 :(得分:0)

可以做一些修复。

  1. 在比较两个字符串(is)时不要使用if key is "b":
  2. 只需说出print(item)而不是.format(),因为您只有一个要打印的变量,没有其他字符串格式
  3. 修订代码:

    for id, obj in myDict.items():
        for key, val in obj.items():
            if key == "b":
                for item in val:
                    print(item)
    

答案 4 :(得分:0)

如果您确定在每种情况下都有b键,则可以执行以下操作:

for id, obj in myDict.items():
    for item in obj["b"]:
        print item