我有一个我正在迭代的字典列表。我希望能够将列表传递给容器对象,然后通过在迭代它时检索每个字典的值的元组来遍历容器。
例如:
myDict = {"key1": "value1string", "key2": "value2string"}
myList = [myDict]
container = ContainerObj(myList)
for value1, value2 in container:
print "value1 = %s, value2 = %s" % value1, value2
我希望输出为:
"value1 = value1string, value2 = value2string"
如何在__iter__
中定义ContainerObj
方法来完成此操作?
我尝试执行以下操作:
class ContainerObj(object):
def __init__(self, listArg):
self.myList = listArg
self.current = 0
self.high = len(self.myList)
def __iter__(self):
return self.myList.__iter__()
def __next__(self):
if self.current >= self.high:
raise StopIteration
else:
myDict = self.myList[self.current]
self.current += 1
return (
myDict.get("key1"),
myDict.get("key2")
)
答案 0 :(得分:2)
我认为你想要的是generators。通常,您可以在函数中使用yield
而不是return
来执行此操作。但在你的情况下,我认为你可以使用itertools来帮助:
from itertools import chain
item_gen = chain(d.values() for d in my_dicts_list)
# Edit: Note that this will give you values continuously (not what you want), should have done
# item_gen = (d.values() for d in my_dicts_list)
要用课程执行此操作,您可以执行以下操作:
class MyContainer(object):
def __init__(self, my_list):
self.the_list = my_list
def __iter__(self):
for d in self.the_list:
yield d.values()
# or:
# yield (d.get("key1", None), d.get("key2", None))
然后你可以像任何迭代一样使用这个对象:
my_con = MyContainer([{"a": 1, "b": 2}, {"a": 3, "b": 4}])
for val1, val2 in my_con:
print "a = %s; b = %s" % (val1, val2)
编辑1:哎呀,意识到我正在归还物品。你只想要价值观。
另外,你本质上是自己制造发电机。使用内置功能,它将更容易,更少痛苦。我强烈建议查看itertools
模块。字典中还有iterkeys
,itervalues
和iteritems
方法。
答案 1 :(得分:0)
要获得所需的输出,只需执行以下操作即可。
t={'l':'t','t':'l'}
','.join('{}={}'.format(key, val) for key, val in t.items())
output = 'l=t,t=l'