【问题标题】:Nested for loop issue嵌套for循环问题
【发布时间】:2014-01-24 20:29:51
【问题描述】:

我无法理解这个 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

这可能是一个愚蠢的问题,但我们将不胜感激。

【问题讨论】:

  • 您能否编辑您的帖子以包含您的输入 (root)、输出预期输出
  • 我还看到你用 python-2.7 python-3.x 标记了这篇文章。我假设你只使用一个。

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


【解决方案1】:
"""
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()

【讨论】:

    【解决方案2】:

    通过嵌套循环,您基本上是在设置一个图表,其中第一个循环的值在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多