为dict中的每个成员调用dict迭代器函数

时间:2017-02-27 09:42:48

标签: python-2.7 dictionary iterator

我想从字典/列表中为每个项目执行一些功能。我试过这样做,但它没有给出预期的结果。这是代码。

class GroupDict(dict):
def iteritems(self):
    # do some operation for every member in dict
    print "in __iter__"
    return super(GroupDict, self).iteritems()
a = GroupDict()
a['a'] = 0
a['b'] = 1
for key in a.iteritems():
    print key

为此我得到输出

in __iter__ ('a', 0) ('b', 1)

但预计是

in __iter__ ('a', 0) in __iter__ ('b', 1)

我不想在for循环中进行操作,但是我在类中提到的任何内容都应该为每个成员执行。请帮帮我。

1 个答案:

答案 0 :(得分:2)

iteritems()仅在循环实际开始之前被调用一次。

让我们看看为什么。这个循环:

for x in EXP:
    do_something()

大致翻译为:

it = iter(EXP)
while True:
    try:
        x = next(it)
    except StopIteration:
        break
    do_something()

如果您想为每位成员做些事情,yield iteritems()def iteritems(self): for k, v in super(GroupDict, self).iteritems(): print "doing something with %s / %s" % (k,v) yield k, v 更容易做到您想要的事情:

import sys
from PyQt5 import QtWidgets

app=QtWidgets.QApplication(sys.argv)
window=QtWidgets.QWidget()
vbox=QtWidgets.QVBoxLayout()
text_1=QtWidgets.QLineEdit()
text_2=QtWidgets.QLineEdit()
run_btn=QtWidgets.QPushButton("run")
text_3=QtWidgets.QLineEdit()
def main():
    data_1=text_1.text()
    data_2=text_2.text()
    text_3.setText(str(data_1)+(data_2))
run_btn.clicked.connect(main)
vbox.addWidget(text_1)
vbox.addWidget(text_2)
vbox.addWidget(run_btn)
vbox.addWidget(text_3)
window.setLayout(vbox)
window.show()
print text_1.text()
sys.exit(app.exec_())