任何可迭代的值(而不是键)上的通用迭代器

时间:2010-11-05 22:11:38

标签: python coding-style iterator

是否有一种通用的方法来获取一个迭代器,它总是迭代字典或其他迭代(列表,集合......)的值(最好,虽然它也可以迭代键)?

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

是否有一个指令,属性......无论什么......总是迭代迭代的值(或键),无论它是什么类型的迭代?

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

iter(dict)

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

能够为这样的情况获得一个共同的迭代器会很棒,所以我可以写一些像......

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

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

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

提前谢谢大家

3 个答案:

答案 0 :(得分:3)

我不知道有什么东西可以做到这一点。我想你可以这样做:

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

答案 1 :(得分:3)

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

但是,您可以选择忽略映射中的键。因为你必须使用Python 2.4,所以使用ABCs是不可能的......我担心最简单的方法是:

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

哪个仍然可以破解,但处理dicts和类似的映射。

答案 2 :(得分:0)

您正在寻找的是dict.items()方法,它返回(键,值)元组。 这是一个用法示例:

d = {'a': 1, 'b': 2, 'c': 3}
for k, v in d.items():
    print "key:", k, "- value:", v

你可以想象,输出

key: a - value: 1
key: b - value: 2
key: c - value: 3

编辑:如果你想获得一个真正的迭代器而不仅仅是一个序列,你也可以使用dict.iteritems()方法,它的工作方式相同。

Edit2:似乎我误解了你的问题,因为你似乎要求一个适用于任何迭代的泛型函数,忘记我的答案; - )