2014-01-24 90 views
0

我在繞過這個for循環時遇到了問題。我似乎無法讓它正常工作。嵌套for loop問題

我所要做的是把它建立名號信息,標題則信息的字符串,等等

這是我的循環:

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 

這可能是一個愚蠢的問題,但任何幫助,將不勝感激謝謝。

+6

你可以編輯你的文章,包括你的*輸入*( 'root'),* output *和* expected output *? – mhlester

+4

另外我看到你已經用python-2.7 *和* python-3.x標記了這篇文章。我假設你只使用一個。 – mhlester

回答

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() 
0

通過嵌套循環,你基本上設置了一個圖形,第一個循環的值在x軸上,第二個循環的值在y軸上。這會讓你輸出所有可能的值混合在一起。例如,如果您的頭銜是:[「Holy Grail」,「Brian of Life」,「Flying Circus」],而您的信息是[「Overwatched」,「NSFW」,「Perfectly Absurd」],您的輸出將爲:

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