优雅地迭代列表或字典

时间:2018-04-26 10:41:28

标签: python list dictionary

我有一个变量(来自数据库的对象)。在某些情况下,此变量可以是列表的类型,在某些情况下可以是词典

变量标准为列表

for value in object_values:
    self.do_something(value)

变量标准为字典

for key, value in object_values.items():
    self.do_something(value)

我可以使用instanceof()两次检查类型,但是我仍然需要两个函数或if两个for周期。我现在有if条件,它调用两个函数中的一个,一个用于迭代为列表(例如iterate_list()),第二个用于迭代为字典(例如iterate_dict())。

有没有更好的选择如何优雅和更加pythonic方式解决问题,我不知道该变量是列表还是字典?

1 个答案:

答案 0 :(得分:5)

在您的情况下,由于数据是字典的项目或值,您可以使用三元组来获取values()或仅使用可迭代的类型:

def iterate(self,object_values):
    for value in object_values.values() if isinstance(object_values,dict) else object_values:
        self.do_something(value)

如果你传递了tuple,生成器或其他可迭代的内容,它会重新回到"标准"迭代。如果您传递字典(或OrderedDict或其他字典),则会迭代值。

在性能方面,三元表达式仅在迭代开始时计算一次,所以很好。

isinstance位甚至可以被if hasattr(object_values,"values")替换,因此即使具有values成员的非dict对象也会匹配。

(请注意,您应该了解"最少的声音和#34;原则。有些人可能期望在调用方法时对字典的键进行迭代)