python - 任何可迭代对象的值(而不是键)的通用迭代器

标签 python coding-style iterator

是否有一种通用的方法来获取一个迭代器,该迭代器始终迭代字典或其他可迭代对象(列表、集合...)的值(最好是,尽管它也可以迭代键)?

让我详细说明一下:当你执行“iter(list)”时,你会得到一个值的迭代器(不是索引,这听起来很像字典中的“键”)但是当你执行“iter(dict)”你就得到了 key 。

是否有一条指令、属性……无论什么……总是迭代可迭代对象的值(或键),无论它是什么类型的可迭代对象?

我有一个带有“附加”方法的代码需要接受几种不同类型的可迭代类型,而我能想出的唯一解决方案是这样的:

#!/usr/bin/python2.4

class Sample(object):
    def __init__(self):
        self._myListOfStuff = list()

    def addThings(self, thingsToAdd):
        myIterator = None
        if (isinstance(thingsToAdd, list) or 
            isinstance(thingsToAdd, set) or 
            isinstance(thingsToAdd, tuple)):
                myIterator = iter(thingsToAdd)
            elif isinstance(thingsToAdd, dict):
                myIterator = thingsToAdd.itervalues()

        if myIterator:
            for element in myIterator:
                self._myListOfStuff.append(element)


if __name__ == '__main__':
    sample = Sample()
    myList = list([1,2])
    mySet = set([3,4])
    myTuple = tuple([5,6])
    myDict = dict(
        a= 7,
        b= 8
    )

    sample.addThings(myList)    
    sample.addThings(mySet) 
    sample.addThings(myTuple)   
    sample.addThings(myDict)
    print sample._myListOfStuff
    #Outputs [1, 2, 3, 4, 5, 6, 7, 8]

我不知道......它看起来有点......对我来说很笨重

如果能够为这种情况获得一个通用的迭代器就太好了,这样我就可以编写类似...

def addThings(self, thingsToAdd):
    for element in iter(thingsToAdd):
        self._myListOfStuff.append(element)

...如果迭代器总是给出值,或者...

def addThings(self, thingsToAdd):
    for element in iter(thingsToAdd):
        self._myListOfStuff.append(thingsToAdd[element])

...如果迭代器返回键(我知道集合中 key 的概念有点“特殊”,这就是为什么我更喜欢迭代值但仍然...也许它可以返回存储值的哈希值)。

Python 中有这样的东西吗? (顺便说一句,我必须使用Python2.4)

先谢谢大家

最佳答案

大多数集合没有概念或“键”或“值”。他们只是存储项目,并迭代它们为您提供这些项目。只有映射(dict-likes)提供“键”和“值”。并且迭代它们的默认方式使用键,因为 for x in collection: assert x in collection 应该是一个不变的(并且 (key, value) in d 很少使意义,而不是 key in d)。所以没有方法只迭代值,因为最少的集合有称为“值”的东西。

但是,您可以选择忽略映射中的键。由于您必须使用 Python 2.4,因此使用 ABC 是不可能的……我担心最简单的方法是:

def iter_values(it):
    if hasattr(it, 'itervalues'):
        return it.itervalues()
    return iter(x)

它仍然可以中断,但可以处理字典和类似的映射。

关于python - 任何可迭代对象的值(而不是键)的通用迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4110544/

相关文章:

html - 我如何风格化这个结构并添加滚动条?

c# - 处理常见错误 : If-Then-Throw blocks vs. 代码契约与断言类

python - pip 在 pyenv 中使用时不应答

python - Python 中的代码未完成执行

c - 在C中将指针分配给结构体时出现问题

c++ - 比较两个不同的 boost::iterator_facade 迭代器

css - 在 Sass 中动态生成类名和 CSS 属性

java - 可逆迭代器

python - 使用 wxPython 显示进度

python - 如何从 Python 中的字符串列表制作旭日图?