通用可遍历的迭代器(而不是针对任何可迭代对象的键)

2024-10-01 07:16:57 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种通用的方法可以得到一个迭代器,它总是迭代字典或其他iterable(列表,集合…)的值(最好,虽然它也可以迭代键)?在

让我详细说明一下:当您执行“iter(list)”时,您会得到一个值的迭代器(而不是索引,这听起来非常类似于字典中的“key”),但是当您执行“iter(dict)”时,您得到了键。在

是否有指令、属性。。。无论什么。。。它总是迭代iterable的值(或键),不管它是什么类型的iterable?在

我有一个带有“append”方法的代码,它需要接受几种不同类型的iterable类型,而我唯一能想到的解决方案是这样的:

#!/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]

我不知道。。。看起来有点。。。我觉得笨手笨脚的

如果能为这种情况提供一个通用的迭代器,那就太好了,这样我就可以写一些类似。。。在

^{pr2}$

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

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

。。。为什么我更喜欢迭代键集合中的键(如果我知道它是一个特殊的,而不是返回的键)。。。也许它可以返回存储值的哈希值)。在

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

提前谢谢大家


Tags: sampleself类型defelementiterabledictlist
3条回答

大多数集合没有概念或“键”或“值”。它们只存储项目,迭代这些项目就可以得到这些项目。只有映射(dict like)提供“键”和“值”。迭代它们的默认方式是使用键,因为for x in collection: assert x in collection应该是一个不变量((key, value) in d很少有意义,与{}相反)。因此,没有方法只对值进行迭代,因为最少的集合具有称为“值”的内容。在

但是,您可以选择忽略映射中的键。由于您必须使用Python2.4,所以使用ABCs是不可能的。。。我担心最简单的方法是:

^{1}$

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

您要寻找的是dict.items()方法,它返回(key,value)元组。 下面是一个用法示例:

^{1}$

正如你所想象的那样

^{pr2}$

编辑:如果您想得到一个真正的迭代器而不仅仅是一个序列,您还可以使用dict.iteritems()方法,它的工作原理是一样的。在

Edit2:似乎我误解了您的问题,因为您似乎要求的是一个可以处理任何iterable的通用函数,忘了我的答案;-)

我不知道有什么东西能做到这一点。我想你可以做些类似的事情:

^{1}$

相关问题 更多 >