嵌套for循环问题

时间:2014-01-24 20:29:52

标签: python python-2.7 for-loop python-3.x

我无法绕过这个for循环。我似乎无法让它正常工作。

我要做的是让它建立一个标题字符串然后信息,标题然后信息等。

这是我的循环:

for pod in root.findall('.//pod'):
        title = pod.attrib['title'] + "\n\n"
        joined += title
        for pt in root.findall('.//plaintext'):
            if pt.text:
                info = " " + pt.text + "\n\n"
                joined += info

这可能是一个愚蠢的问题,但任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

"""
Try buffering all data and then obtain the string you want.
I'm assuming your want output like

title1 info1
title1 info1
title1 info2
title1 info2
title2 info1
title2 info2
...
...

"""


import StringIO

my_string_buf = StringIO.StringIO()
for pod in root.findall('.//pod'):
    for pt in root.findall('.//plaintext'):
         if pt.text:
              my_string_buf.write("{0} {1}\n".format(pod, pt.text))

# Reset buffer.
my_string_buf.seek(0)

# Obtain the string.
my_string = my_string_buf.read()

答案 1 :(得分:0)

通过嵌套循环,您基本上设置了一个图形,其中x轴上的第一个循环值和y轴上的第二个循环值。这将使您输出所有可能的值混合在一起。例如,如果你的头衔是:[“圣杯”,“布莱恩的生活”,“飞行马戏团”],你的信息是[“Overwatched”,“NSFW”,“完全荒谬”]你的输出将是:

"""
Holy Grail Overwatched
Holy Grail NSFW
Holy Grail Perfectly Absurd
Life of Brian Overwatched
...
"""

要解决此问题,您需要找到一些方法来关联标题和信息。例如,您可能能够合并root.findall()调用以一次获取两条信息(这似乎不是标准的库命令,所以我无法告诉您这是否适合您)。

如果你知道root.findall()以正确的顺序返回,那么你应该可以使用它:

pods = root.findall('.//pod')
plain_text = root.findall('.//plaintext')
for title,info in zip(pods,plain_text):
    joined += "{0} {1}\n\n".format(title,info)

内置zip()函数接受两个列表并创建一个新列表,其中第一个元素是输入列表的第一个元素的组合,第二个元素是输入列表的第二个元素的组合等等...您可以阅读有关zip() here

的更多信息