假设我有这样的字典:
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方式来做到这一点?
答案 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)
可以做一些修复。
is
)时不要使用if key is "b":
print(item)
而不是.format()
,因为您只有一个要打印的变量,没有其他字符串格式修订代码:
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