Печать в файл из списка списков в Python - PullRequest
1 голос
/ 08 февраля 2010

Я пытаюсь распечатать файл, который будет выглядеть так:

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

Ответы [ 6 ]

7 голосов
/ 08 февраля 2010

Прежде всего, не используйте iter и next(), для этого 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 голосов
/ 08 февраля 2010

Я думаю, что лучший способ решить эту проблему - использовать простой вложенный цикл. Попробуйте это:

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
1 голос
/ 08 февраля 2010

Простая причина, по которой вы получаете неправильное содержимое файла, заключается в том, что вы звоните iter дважды. Строки 15-16:

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

Подробнее о семантике Pythonic для печати см. В других ответах

1 голос
/ 08 февраля 2010

Ваш код может быть намного проще:

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 голосов
/ 08 февраля 2010

Вы можете просто перебрать все элементы списка с помощью itertools.chain (задокументировано здесь ):

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))
0 голосов
/ 08 февраля 2010

Включение кавычек в вывод немного странно, но если вы настаиваете:

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

Вы не указываете, что произойдет, если во внутреннем списке нет только одного элемента, поэтому любая другая возможность здесь игнорируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...