2010-02-08 4 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

+0

Внутренние списки всегда один пункт ... – cit

+1

Wow. Вы полностью окружили всю цель итераторов. Это просто садизм. Итераторы специально разработаны для работы с петлями. Кроме того, списки уже итераторы, поэтому нет необходимости создавать новый итератор из 'listoflists'. – jcdyer

ответ

7

Прежде всего, не используйте 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() 
+0

Спасибо, мне нравится это решение .. Есть и хорошие альтернативы ниже ... но мне нравится многословие, так как я, как правило, забываю, как я делал что-то по прошествии времени ... – cit

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

+0

Не забывая окончания строки ... – MattH

+0

@danben Спасибо и @mizipzor, что вы правы. У меня были списки элементов, потому что он представляет собой реальное упрощение скрипта, который у меня есть, который извлекает некоторые данные из sqlite db ... one у списка есть поле даты, а в другом списке - содержимое другого поля ... Я, вероятно, делаю это и в некотором ужасно неэффективном виде ... но он работает, поэтому я не возился с ним! – cit

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

+0

Исправлено. Хотя я предпочитаю скобки, так как я нахожу их более легкими для чтения, его уже довольно много джунглей специальных персонажей, что делает большую часть их круглых скобок не помогает. И вам нужно работать с довольно большими списками, чтобы заметить прирост памяти. Не стесняйтесь редактировать мой ответ, если вы видите место для улучшения. :) – Mizipzor

+0

Он не имел в виду замену скобок круглыми скобками, он хотел удалить скобки. Вам нужно всего два слоя круглых скобок в вашей записи(). –

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

Для более вещей печатной семантики, увидеть другие ответы

Смежные вопросы