是否有一种通用的方法来获取一个迭代器,该迭代器始终迭代字典或其他可迭代对象(列表、集合...)的值(最好是,尽管它也可以迭代键)?
让我详细说明一下:当你执行“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/