在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