python迭代字典列表

标签 python list iterator

我有一个正在迭代的字典列表。我希望能够将列表传递给容器对象,然后在迭代它时通过检索每个字典的值的元组来遍历容器。

例如:

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

最佳答案

我想你想要的是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)中执行此操作,您可以执行以下操作:

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 方法。

关于python迭代字典列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22323066/

相关文章:

Python字符串格式问题

python - 覆盖 Django 表单的默认属性

vb.net - 有没有一种简单的方法可以在 VB.NET 中随机化列表?

python - 现场交叉口操作

python - 将 __float__ 与非浮点类型一起使用

python - 是什么让神经网络学习 x/256 的类别是 x 的分类器如此困难?

python - Process 和 Pool 类是否共享同一个 worker?

ruby-on-rails - Ruby 将两个数组合并为一个

python - 如何迭代切片?

c++ - 在最后一个元素迭代器上停止 C++