Python 如何优雅地迭代列表或字典

Python 如何优雅地迭代列表或字典,python,list,dictionary,Python,List,Dictionary,我有一个变量(来自数据库的对象)。在某些情况下,此变量的类型可以是列表,在某些情况下可以是字典 如果变量为列表,则循环标准为: for value in object_values: self.do_something(value) for key, value in object_values.items(): self.do_something(value) 如果变量为字典,则循环标准为: for value in object_values: self.do_s

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

如果变量为列表,则循环标准为:

for value in object_values:
    self.do_something(value)
for key, value in object_values.items():
    self.do_something(value)
如果变量为字典,则循环标准为:

for value in object_values:
    self.do_something(value)
for key, value in object_values.items():
    self.do_something(value)
我可以使用
instanceof()
two检查类型,但我仍然需要两个函数或
if
和两个
循环。我现在有了
if
条件,它调用两个函数中的一个,一个用于作为列表进行迭代(例如
iterate\u list()
),第二个用于作为字典进行迭代(例如
iterate\u dict()


有没有更好的选择,如何优雅和更具python风格的方式来解决我不知道变量是list还是dictionary的问题?

在您的例子中,由于数据是dictionary的项或值,您可以使用三元组来获取
值()
或仅根据类型选择iterable:

def iterate(self,object_values):
    for value in object_values.values() if isinstance(object_values,dict) else object_values:
        self.do_something(value)
如果您传递一个
元组、生成器或其他iterable,它将返回“标准”迭代。如果传递字典(或
OrderedDict
或其他),它将对值进行迭代

就性能而言,三元表达式在迭代开始时只计算一次,所以这很好

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


(请注意,您应该了解“最少赎罪”原则。有些人可能希望在调用该方法时对字典的键进行迭代)

第二个示例:
对象中的值\u values.values():
然后,它可以返回两件事中的一件,这非常奇怪。我觉得这听起来不太对。