有没有更好的方法来迭代python中的嵌套循环

时间:2017-10-20 15:10:06

标签: python algorithm python-3.x optimization

我有一些代码正在通过嵌套循环运行。我猜测还有更多" pythonic"这样做的方式。有什么建议?

代码的基本部分如下所示:

   for e in range(len(listOfTuples)):

        for item in self.items:
            if item.getName() == listOfTuples[e][0]:
                <do stuff>
            if item.getName() == listOfTyples[e][1]:
                <do other stuff>
                continue

        if <both above if statements got answers>:
            <do yet more stuff>

有没有更好的方法来编写这些嵌套循环?

2 个答案:

答案 0 :(得分:0)

您可以使用生成器功能。至少它隐藏了&#34;丑陋&#34;嵌套for循环给你。

def combine_items_and_tuples(items, listOfTuples):
   for e in range(len(listOfTuples)):
        for item in items:
            yield e, item

只需用:

来调用它
for e, item in combine_items_and_tuples(self.items, listOfTuples):
      if item.getName() == listOfTuples[e][0]:
                <do stuff>
      if item.getName() == listOfTyples[e][1]:
                <do other stuff>
                continue

      if <both above if statements got answers>:
            <do yet more stuff>

正如评论中已经提到的,你也可以直接迭代listOfTuples,因为它是可迭代的(看看python glossary):

for tuple in listOfTuples:

答案 1 :(得分:0)

直接在listOfTuples上迭代并解压缩我们关心的值

for a, b, *_ in listOfTuples:

    a_check, b_check = False, False

    for item in self.items:
        if item.name == a:
            #do stuff
            a_check = True         
        if item.name == b:
            #do stuff
            b_check = True

    if a_check and b_check:
        #do more stuff

*_捕获listOfTuples中元组前两个元素的内容(假设我们想要的只是前两个元素)。

请注意,我使用item.name代替item.getName。 Python通常不关心getter和setter,因为私有变量没有真正的概念。