Python 遍历字典列表

2 投票
2 回答
1309 浏览
提问于 2025-04-17 21:46

我有一个字典列表,我想要遍历这个列表。我希望能把这个列表传给一个容器对象,然后在遍历这个容器的时候,能够获取到每个字典的值,并以元组的形式返回。

举个例子:

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"

我该如何在ContainerObj中定义__iter__方法来实现这个功能呢?

我尝试过以下方法,但没有成功:

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")
            )

2 个回答

0

要得到想要的输出,只需像下面这样做。

t={'l':'t','t':'l'}

','.join('{}={}'.format(key, val) for key, val in t.items())

output = 'l=t,t=l'
2

我觉得你想要的是生成器。通常你可以在函数里用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模块。字典还有iterkeysitervaluesiteritems这些方法。

撰写回答