2012-04-16 14 views
6

.txt için listeyi kaydedin.Pythonictir yolu listedeki tüm öğeleri değiştirebilir ve ben dizeleri bir listesi var dosyayı

theList = ['a', 'b', 'c'] 

böyle bir çıkış sonuçlanan dizelerine tamsayılar eklemek istiyorum:

Ben bu biçimde, .txt dosyasına kaydetmek istiyor
newList = ['a0', 'b0', 'c0', 'a1', 'b1', 'c1', 'a2', 'b2', 'c2', 'a3', 'b3', 'c3'] 

:

a0 
b0 
c0 
a1 
b1 
c1 
a2 
b2 
c2 
a3 
b3 
c3 

girişimi: şimdi sağ

theList = ['a', 'b', 'c'] 
newList = [] 

for num in range(4): 
    stringNum = str(num) 
    for letter in theList: 
     newList.append(entry+stringNum) 

with open('myFile.txt', 'w') as f: 
    print>>f, newList 

Ola n dosya myfile.txt kaydetmek ancak dosyadaki metin okur: Var çok hoş benim hedefe ulaşmak için daha pythonic yolları

['a0', 'b0', 'c0', 'a1', 'b1', 'c1', 'a2', 'b2', 'c2', 'a3', 'b3', 'c3'] 

Herhangi bir ipucu,

yerine son çizgi, kullanım
+0

Yanıt Verenler, OP değil daha kısa veya daha karmaşık "daha fazla Pythonic" çözüm isteniyor ettiğini unutmayın. (Örneğin küçük sayılarla gerçekten önemli olmasa gerektir) –

cevap

7

:

f.write("\n".join(newList)) 

Bu, dizeleri newList'e, yeni satırlarla ayrılmış olarak, f'ye yazacaktır. Aslında yok newlist gerekirse sen giderken, kendi iki döngüler birleştirmek ve dizeleri yazabilirsiniz unutmayın: Eğer sıkıştırmak istiyorsanız

the_list = ['a', 'b', 'c'] 

with open('myFile.txt', 'w') as f: 
    for num in range(4): 
     for letter in the_list: 
      f.write("%s%s\n" % (letter, num)) 
+0

güzel .. ve genel olarak range'' üzerinde iyilik 'xrange' o piton 3. – Levon

+3

Bu sitedeki cevapları 'range' kullanmak daha iyidir – jamylak

+0

ile uyumlu olduğu için @jamylak Hala 2.6/7 kodladığımı söyleyebilir misiniz? Bunu işaret ettiğin için teşekkürler. – Levon

2

Bu muhtemelen işinizi

with open('myFile.txt', 'w') as f: 
    for row in itertools.product(range(len(theList)+1),theList): 
     f.write("{1}{0}\n".format(*row)) 
+0

Bu, doğru çıktıyı yazdırmıyor. – jamylak

+0

@jamylak: Bunu işaretlediğiniz için teşekkürler. Ben bu sorunu giderdim – Abhijit

+0

ben bu aslında olduğunu düşünüyorum itertools – Marchy

2

yapacağını kodunuzu yapabileceğiniz biraz:

>>> n = 4 
>>> the_list = ['a', 'b', 'c'] 
>>> new_list = [x+str(y) for x in the_list for y in range(n)] 
>>> with open('myFile.txt', 'w') as f: 
...  f.write("\n".join(new_list)) 
+0

aşina değilim, teşekkürler * az * Pythonic OP'ın çözümü daha: 1) 'Liste tanımlama olarak Python gibi değildir map' ve' lambda' kullanır veya düz 'list.append', 2) harita + lambda + itertools nedenle, daha az Python iSH Zen, 3)' with' deyimi kullanmaz hale daha karmaşık ve sadece KISS çözümden çok muhtemelen yavaştır Dosya kapalı olmayabilir (CPython'da olsa da), 4) kodunuzu gzip kullanarak sıkıştırmak daha iyidir. :-) –

+0

bu çok okunabilir bu kısa koduna tüm bu sıkmak için oldukça serin bazı düzeylerde olsa (Basit karmaşık daha iyidir) olduğunu sanmıyorum. – Levon

+0

Biliyorum, öğrenme öğrenmeye başladığımdan beri kodum çirkin ve çirkinleşiyor. Urgh. – luke14free

1

yaptığın şey gayet - Zen of Python içinde noktalarından biri "basit karmaşık daha iyidir" dir. Bunu tek liner olarak yeniden yazabilirsin (muhtemelen yuvalanmış liste kavramasını kullanarak), fakat sahip olduğunuz şey iyi ve anlaşılması kolay.

Ama olabilecek bazı küçük değişiklikler vardır:

  • Genellikle JSON gibi, metin dosyasında bir daha taşınabilir seri kullanmak daha iyidir, Python en json.dump(newList, f) aracılığıyla. Yine de, with ifadesini kullanmak için iyi. Sorunuz başlığı tüm öğeleri değiştirmek" diyor: ekleme
  • PEP-8 adlandırma kurallarına uyun gibi iyidir içinde str(num) böylece new_list yerine newList
  • nitpicking ait -
  • Ayrı stringNum değişkeni gerekmez Aslında, aslında gerçekte kodunuz yeni bir liste oluşturuyor. Genellikle bu Pythonic şey zaten yapmak - yerinde yerinde değişiklik gibi yan etkileri genellikle daha az yararlıdır.
+0

PEP-8 sözleşmeler yoluyla JSON ve okumaya görünüyordu. append- sayesinde İçinde (oldukça bariz bir şimdi görüyorum: D) Haklısın, ben listesinde değişiklik isteyen yola ama benim kodda yeni bir tane yarattı. Daha iyi bir fikir gibi görünüyor. Teşekkürler – Marchy

İlgili konular