使用如下设置迭代字典的pythonic方法是什么:
dict = {'a': [1, 2, 3], 'b': [3, 4, 5], 'c': 6}
如果我只想在a
和b
中的所有值上迭代for循环并跳过c
。显然有一百万种方法可以解决这个问题,但我宁愿避免这样的事情:
for each in dict['a']:
# do something
pass
for each in dict['b']:
# do something
pass
像破坏性的东西:
del dict['c']
for k,v in dict.iteritems():
pass
答案 0 :(得分:2)
更通用的方法是在生成器表达式的末尾添加if
,使用类似过滤器的方法。
如果要迭代每个可迭代值,请使用hasattr
:
for key in (k for k in dict if hasattr(dict[k], '__iter__')):
for item in dict[key]:
print(item)
如果您想要排除某些密钥,请使用"而不是"过滤器:
invalid = set(['c', 'd'])
for key in (k for k in dict if key not in invalid):
....
如果您只想选择特定键,请使用" in"过滤器:
valid = set(['a', 'b'])
for key in (k for k in dict if key in valid):
....
答案 1 :(得分:2)
与SSDMS的解决方案类似,您也可以这样做:
mydict = {'a': [1, 2, 3], 'b': [3, 4, 5], 'c': 6}
for each in mydict['a']+mydict['b']:
....
答案 2 :(得分:1)
您可以使用itertools
模块中的chain
执行此操作:
In [29]: from itertools import chain
In [30]: mydict = {'a': [1, 2, 3], 'b': [3, 4, 5], 'c': 6}
In [31]: for item in chain(mydict['a'], mydict['b']):
...: print(item)
...:
1
2
3
3
4
5
要仅迭代值,字典中作为list
实例的键值只需使用chain.from_iterable
。
wanted_key = ['a', 'b']
for item in chain.from_iterable(mydict[key] for key in wanted_key if isinstance(mydict[key], list)):
# do something with the item