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():
然后,它可以返回两件事中的一件,这非常奇怪。我觉得这听起来不太对。