2010-02-08 92 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印刷语义,看到其他的答案