2010-02-08 82 views
1
列表的文件

我試圖打印到文件,這將是這樣的:打印從名單在Python

'A' 
'1' 
'B' 
'2' 
'C' 
'3' 

考慮下面的代碼,但是,其結果是:

['A'] 
['B'] 
['C'] 

這可能是'壘球'的問題,但我在這裏做錯了什麼?

l1 = ['1'] 
l2 = ['A'] 
l3 = ['2'] 
l4 = ['B'] 
l5 = ['3'] 
l6 = ['C'] 

listoflists = [l1,l2,l3,l4,l5,l6] 
itr = iter(listoflists) 

f = open ('order.txt','w') 

while True: 
    try: 
      itr.next() 
      s = str(itr.next()) 
      f.write(str('\n')) 
      f.write(s) 

    except StopIteration: 
     break 
f.close() 
+0

人的內心名單總是隻包含一個項目?沒有更多,永遠不會更少? – Mizipzor 2010-02-08 14:53:41

+0

內部列表總是一個項目... – cit 2010-02-08 15:10:57

+1

哇。你完全繞過了迭代器的全部目的。這只是虐待。迭代器專門設計用於for循環。而且,列表已經是迭代器,所以不需要從'listoflists'創建一個新的迭代器。 – jcdyer 2010-02-08 15:28:33

回答

7

首先,不要使用iternext(),這就是for的用途。其次,你實際上正在給文件寫一個列表,而不是其內容。因此,您可以打印列表的第一個元素(即l1[0])或遍歷所有內部列表元素。

您的代碼應該是這樣的:

l1 = ['1'] 
l2 = ['A'] 
l3 = ['2'] 
l4 = ['B'] 
l5 = ['3'] 
l6 = ['C'] 

listoflists = [l1,l2,l3,l4,l5,l6] 

f = open ('order.txt','w') 

for inner_list in listoflists: 
    for element in inner_list: 
     f.write(element+'\n') 

f.close() 
+0

謝謝,我喜歡這個解決方案..以下還有一些很好的替代方案......但我喜歡這種冗長,因爲我傾向於忘記隨着時間的流逝我是如何做的... – cit 2010-02-08 15:27:59

1

你的代碼可能是簡單了很多:

for list in listoflists: 
    f.write(str(list)) 
    f.write('\n') 

但是,這會打印出類似這樣['1']。看起來你想要更類似的東西:

for list in listoflists: 
    f.write(str(list[0])) 
    f.write('\n') 

此外,爲什麼你有一堆單元素列表?你不能把所有的元素放到一個列表中嗎?

+0

關於單元素列表,爲了清晰起見,代碼可能已被簡化。 – Mizipzor 2010-02-08 14:33:49

+0

不要忘記行結束... – MattH 2010-02-08 14:34:14

+0

@danben感謝和@ mizipzor你是對的..我有單個元素列表,因爲它代表了一個腳本的真正簡化我已經從SQLite數據庫中抽出一些數據...一個列表中包含日期字段,另一個列表中包含另一個字段的內容......我可能以某種非常低效的方式執行該操作......但它正在工作 - 所以我不會搞亂它! – cit 2010-02-08 15:00:07

3

我認爲要解決這僅僅是一個基本的嵌套循環的最佳方式。試試這個:

l1 = ['1'] 
l2 = ['A'] 
l3 = ['2'] 
l4 = ['B'] 
l5 = ['3'] 
l6 = ['C'] 
listoflists = [l1,l2,l3,l4,l5,l6] 

f = open("out.txt","w") 

# for each list and 
# for each item in the list; 
# write the item to the file, separated by a comma 
for list in listoflists: 
    for item in list: 
     f.write(item+",") 

f.close() 

Out.txt現在持有:

1,A,2,B,3,C, 

哦,沒有Python的問題是不完整的一個班輪解決方案(這也從我最初去掉後面的逗號響應)。

open("out.txt","w").write(",".join(("".join(i) for i in listoflists))) 

Out.txt現在持有:

1,A,2,B,3,C 
+0

您可以刪除括號在單行解決方案中 - 通過使用生成器而不是創建列表對象來節省內存。 – AndiDog 2010-02-08 15:04:02

+0

固定。儘管我更喜歡括號,因爲我覺得它們更容易閱讀,但它已經相當多的特殊字符的叢林,使大多數括號不會幫助。而且你必須使用相當大的列表來記錄增益。如果你能看到改進的餘地,請隨意編輯我的答案。 :) – Mizipzor 2010-02-08 15:09:14

+0

他並不是指用括號替換括號,他的意思是刪除括號。你的write()中只需要兩層括號。 – 2010-02-08 16:00:50

0

包括出的報價是有點古怪,但如果你堅持:

for entry in listoflists: 
    print >>f, repr(entry[0]) 

不指定會怎樣如果內部列表不包含一個元素,則會發生其他可能性。

0

您可以通過與itertools.chain(記錄here)所有列表元素,簡單地重複:

import itertools 

l1 = ['1'] 
l2 = ['A'] 
l3 = ['2'] 
l4 = ['B'] 
l5 = ['3'] 
l6 = ['C'] 

chainedlists = itertools.chain(l1,l2,l3,l4,l5,l6) 

with open ('order.txt','wt') as f: 
    for element in chainedlists: 
     # Change this how you want it to be formatted, it will output 
     # a string "a" as 'a' (with the quotes) 
     f.write("%s\n" % repr(element)) 
1

原因很簡單,爲什麼你得到了錯誤的文件內容,是因爲你在呼喚iter兩次。第15-16行是:

itr.next() 
s = str(itr.next()) 

對於更Python印刷語義,看到其他的答案