【问题标题】:Printing to a file from a list of lists in Python从 Python 中的列表列表打印到文件
【发布时间】:2010-02-08 14:26:42
【问题描述】:

我正在尝试打印到如下所示的文件:

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

【问题讨论】:

  • 内部列表是否总是只包含一项?永远不会更多,永远不会更少?
  • 内部列表总是一项...
  • 哇。您完全绕过了拥有迭代器的全部目的。那只是虐待狂。迭代器是专门为使用 for 循环而设计的。此外,列表已经是迭代器,因此无需从 listoflists 创建新的迭代器。

标签: python file list iteration


【解决方案1】:

首先,不要使用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()

【讨论】:

  • 谢谢,我喜欢这个解决方案.. 下面也有一些不错的替代方案.. 但我喜欢它的冗长,因为随着时间的推移,我往往会忘记我是如何做事的.. .
【解决方案2】:

我认为解决这个问题的最好方法就是使用基本的嵌套循环。试试这个:

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

【讨论】:

  • 您可以删除单行解决方案中的括号 - 通过使用生成器而不是创建列表对象来节省内存。
  • 已修复。虽然我更喜欢括号,因为我发现它们更容易阅读,但那里已经有很多特殊字符了,让它们中的大多数都使用括号并没有帮助。而且您必须使用相当大的列表才能注意到内存增加。如果您可以看到改进的空间,请随时编辑我的答案。 :)
  • 他的意思不是用括号替换括号,他的意思是删除括号。你的 write() 中只需要两层括号。
【解决方案3】:

您的代码可能会简单得多:

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

但是,这将打印出类似['1'] 的内容。您似乎想要更多类似的东西:

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

另外,为什么你有一堆单元素列表?你不能把所有元素放在一个列表中吗?

【讨论】:

  • 关于单元素列表,为了清晰起见,可能已经简化了代码。
  • @danben 谢谢@mizipzor,你是对的。我有单个元素列表,因为它代表了我拥有的脚本的真正简化,它从sqlite db中提取了一些数据...一个列表有日期字段和另一个列表包含另一个字段的内容......我可能也在以一种非常低效的方式这样做......但它正在工作 - 所以我没有搞砸它!
【解决方案4】:

您得到错误文件内容的简单原因是因为您调用了两次iter。第 15-16 行是:

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

有关更多 Pythonic 打印语义,请参阅其他答案

【讨论】:

    【解决方案5】:

    在输出中包含引号有点奇怪,但如果你坚持:

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

    如果内部列表不只有一个元素,您没有指定会发生什么,因此这里忽略任何其他可能性。

    【讨论】:

      【解决方案6】:

      您可以使用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))
      

      【讨论】:

        猜你喜欢
        • 2018-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-16
        相关资源
        最近更新 更多