用不同的元素遍历列表

时间:2018-08-24 08:20:05

标签: python python-3.x list dictionary

我有三种类型的元素:字典,带一个字典的列表和带多个字典的列表。

a = {"foo":1}
b = [{"foo":2}]
c = [{"foo":3}, {"foo":4}]
list = [a, b, c]

我要打印所有四个值。我想到的唯一方法是检查type()的每个元素的list,或使用tryexcept,例如:

for i in list:
    try:                     # i is a dict
        print(i["foo"])
    except:                  # i a list
        for e in i:
            print(e["foo"])

还有更好的方法吗?

4 个答案:

答案 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