是否有一种通用的方法来获取一个迭代器,它总是迭代字典或其他迭代(列表,集合......)的值(最好,虽然它也可以迭代键)?
让我详细说明:当你执行“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)
提前谢谢大家
答案 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:似乎我误解了你的问题,因为你似乎要求一个适用于任何迭代的泛型函数,忘记我的答案; - )