在Python2.7中,是否有一种通用的方法来迭代dict的一组或多个值?
我希望集合是集合或目录。问题是:在Python2.7中,是否有一种通用的方法来迭代dict的一组或多个值?,python,Python,我希望集合是集合或目录。问题是: for element in collection: print element 如果collection是一个集合,则会给我元素,但如果collection是一个dict,则会给我索引。我想要的是一个遍历dict值的单行程序 这可能吗?测试映射最简单的方法是在以下情况下使用isinstance: 如果您需要经常这样做(您不应该这样做,或者您可能有设计问题),您可以将其移动到函数中: def values(collection): return
for element in collection:
print element
如果collection是一个集合,则会给我元素,但如果collection是一个dict,则会给我索引。我想要的是一个遍历dict值的单行程序
这可能吗?测试映射最简单的方法是在以下情况下使用
isinstance
:
如果您需要经常这样做(您不应该这样做,或者您可能有设计问题),您可以将其移动到函数中:
def values(collection):
return (collection.values()
if isinstance(collection, collections.Mapping) else collection)
for element in values(collection):
编辑:我已经复制了。我的答案因将解决方案作为函数实现而有所不同。我发现Python对于将问题分解为可重用的部分非常有用。如何:
def vals(c):
try: return c.values()
except: return c
for a in vals(whatever):
...
特别是那些被洗脑的裸体者,除了“坏习惯”:
去告诉他们。可能有一些聪明的技巧可以做到这一点(
getattr(type(collection),'values',iter)(collection)
,但我从不建议这样做),但任何这样的一个单行程序都是一个非常聪明的黑客。有没有办法避免这种情况?更明确的检查(必须跨越多行)又有什么错呢?@delnan这肯定是错误的方法,但也很聪明。现在我必须想出一些可怕的方法来使用默认值,比如说…为什么你不知道你要使用的是哪种类型?没有必要让它成为一个生成器。您只需将我在答案中使用的条件表达式移动到函数中(我已将其编辑到我的答案中),就可以避免一定程度的间接性。@agf,您的函数使用的生成器表达式与屈服,对吗?不管怎样,我给你+1。@MarkRansom他的答案中没有生成器表达式-它确实是一样的,但只有一个条件表达式。@delnan,你说得对。生成器表达式中的某个地方会有一个for。这不是我迄今为止最好的一天。如果你在<代码>中除了<代码>之外更明确一些,这将是一个python式的回答。这是x.values()的例外版本,如果hasattr(x,'values')else x
,这与我的答案没有太大区别;在这里使用duck类型是非常合适的。@agf:重点是向OP表明,他们的问题可以(也应该)在没有显式类型检查的情况下得到解决(这听起来像地狱)。
import collections
def values(collection):
for v in collection.values() if isinstance(collection, collections.Mapping) else collection:
yield v
for element in values(collection):
print element
def vals(c):
try: return c.values()
except: return c
for a in vals(whatever):
...
find "/System/Library/Frameworks/Python.framework" -name "*.py" | xargs grep "except:" | wc -l
2901