我有三种类型的元素:字典,带一个字典的列表和带多个字典的列表。
a = {"foo":1}
b = [{"foo":2}]
c = [{"foo":3}, {"foo":4}]
list = [a, b, c]
我要打印所有四个值。我想到的唯一方法是检查type()
的每个元素的list
,或使用try
和except
,例如:
for i in list:
try: # i is a dict
print(i["foo"])
except: # i a list
for e in i:
print(e["foo"])
还有更好的方法吗?
答案 0 :(得分:2)
您可以使用isinstance
例如:
a = {"foo":1}
b = [{"foo":2}]
c = [{"foo":3}, {"foo":4}]
l = [a, b, c]
for i in l:
if isinstance(i, dict): #Check if dict object
print(i["foo"])
elif isinstance(i, list): #Check if list object
for j in i:
print(j["foo"])
输出:
1
2
3
4
答案 1 :(得分:1)
您可以显式检查数据类型:
mylist = [a, b, c]
for i in mylist:
if isinstance(i,dict):
print(i["foo"])
elif isinstance(i,list):
for e in i:
print(e["foo"])
但是,如果您调用变量list
,则此无效。此代码段说明了为什么您不应该这样做。
答案 2 :(得分:1)
您可以将递归生成器与您的try
/ except
想法结合使用:
a = {"foo":1}
b = [{"foo":2}]
c = [{"foo":3}, {"foo":4}]
L = [a, b, c]
def get_values(x):
for i in x:
try:
yield i['foo']
except TypeError:
yield from get_values(i)
res = list(get_values(L)) # [1, 2, 3, 4]
或者,使用`isinstance:
def get_values(x):
for i in x:
if isinstance(i, dict):
yield i['foo']
else:
yield from get_values(i)
请注意,您不应永远在内置变量后命名变量,例如使用list_
或L
代替list
。
答案 3 :(得分:1)
如果要对更多嵌套元素(例如列表中的dict中的列表)执行此操作,则可以为每种可能的数据类型创建一个函数。
class Printer():
def print_element(self, element):
if isinstance(element, dict):
self._print_dict(element)
elif isinstance(element, list):
self._print_list(element)
else:
print(element)
def _print_dict(self, element):
for key,value in element.items():
self.print_element(value)
def _print_list(self, element):
for value in element:
self.print_element(value)
a = {"foo":1}
b = [{"foo":2}]
c = [{"foo":3}, {"foo":4}, [1, {"foo":[9,8,7,6]}]]
Printer().print_element(c)
输出:
3
4
1
9
8
7
6