2014-04-06 11 views
5

Belirsiz başlık için özür dilerim, ancak açık bir şekilde açıklamak zor. Yaptığımı düşünüyordumHer dize elemanını bölme ve diziye dahil etmenin en iyi yolu?

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'] 

Tek yön: Ben bu olsun istiyorum itibaren

['a', 'b', 'c\nd', 'e', 'f\ng', 'h', 'i'] 

:

Temelde

, şöyle ben (Python) bir listesi var hayal ,

reduce(lambda x, y: x + y.split('\n'), lst, []) 

Ama bu çok etkili olduğunu düşünmüyorum: Bu şöyle reduce kullanıyordum Çünkü her bir elemanın içinde ayırıcı olduğunu bildiğimiz gerçeğinden yararlanmıyoruz. Baska öneri?

Düzenleme: dizinin nasıl oluşturulduğu hakkında daha fazla bilgi için sorun olabilir.

Ben formda metin var:

Ignorable line 
Field name 1|Field name 2|Field name 3|Field name 4 
Value 1|Value 2|Value 3|Value 4 
Value 1|Value 2|Value 3|Value 4 
... 

biz alan adlarına bir keyfi miktarda olabilir ve orada olacak her zaman on line alan adları gibi değerlere eşit sayıda. Değerlerde yeni çizgiler olabileceğimizi unutmayın. Sadece biliyoruz ki, bir '|' ile ayrılacaktır. Bu yüzden şu anda bu yüzden kendi dizede kendi dizesinde alan adları ve değerleri almak bir s.split('\n', 2) yaparak olduğunu yapmak nasıl

Value 1|This is an long 
value that extends over multiple 
lines|Value 3|Value 4 

olabilir. Sonra, değerleri '|' ile ayırarak, orijinal olarak bahsettiğim formun listesini alırız.

+1

... Göründüğü gibi ne yaptığını çok açıktır ki ne yapacağını okunabilirliği feda eden optimize senin n'in 3'den 2'ye değişmesi ... muhtemelen çok hızlı olmasının yanısıra ... aslında değil, ama bu durumda senin darboğaz olduğunu biliyordun.Prematüre optimizasyon tüm kötülüklerin köküdür –

+1

Örnekte \ n her zaman 3. maddeyi izler (c alfabenin 3 harfidir; f 6'dır). Bu formatta ilk listeyi almanıza neden olan şeyin ne olduğunu merak ediyorum. Belki de orijinal listeyi nasıl değiştirdiğini değiştirdiysen kod daha temiz olurdu ... bu kırık bir ayrıştırıcı için bir iş gibi görünüyor. – ramcdougal

+0

@ramcdougal Bu listeyi oluşturmanın en iyi yolu olmayabilir. Gönderiyi bu formda nasıl aldığımla güncelleyeceğim. – mp94

cevap

10

2. listeyi almak için ('\n'.join(lst)).split()'u yapabilirsiniz. split('\n') üzerinde split() öneren @Joran Beasley için

In [17]: 

%timeit reduce(lambda x, y: x + y.split('\n'), lst, []) 
100000 loops, best of 3: 9.64 µs per loop 
In [18]: 

%timeit ('\n'.join(lst)).split() 
1000000 loops, best of 3: 1.09 µs per loop 

teşekkürler!

Şimdi Güncellenmiş soruya bakın Düzenleme, biz başlangıçta böyle bir durumla karşılaşmaktan kaçınmak düşünüyorum, (re kullanarak) bakın:

In [71]: 

L=re.findall('([^|]+)\|', 
      ''.join(['|'+item+'|' if item.count('|')==3 else item for item in S.split('\n')[1:]])+'|') 
In [72]: 

zip(*[L[i::4] for i in range(4)]) #4 being the number of fields. 
Out[72]: 
[('Field name 1', 'Field name 2', 'Field name 3', 'Field name 4'), 
('Value 1', 'Value 2', 'Value 3', 'Value 4'), 
('Value 1', 
    'This is an longvalue that extends over multiplelines', 
    'Value 3', 
    'Value 4')] 

başlangıçta SAS için veri kümesi benziyor ben haklı mıyım?

+0

Bu kesinlikle daha hızlıdır, ancak diğer elemanlarda da yeni çizgiler olabilir (çoklu, bilinmeyen miktarlarda olabilir). Yayını bu bilgilerle güncelleyeceğim. – mp94

+0

Sorunu çözmek için bir şansın var mı? Değilse, düzenlemeye bakın. –

+0

Yaptım, ama bu da işe yarayacaktı. Ayrıştırma yaptığım çıktı, aslında Linux'taki wmic yardımcı programını kullanan bir WQL sorgusunun isteği. Bkz. Http://www.aldeid.com/wiki/Wmic-linux – mp94

2

prematüre optimizasyon tüm kötü

aslında çünkü bir şey şu bu kodun performans sorunları yaşıyorsanız köküdür, ama şüphesiz.

Eğer sık ​​sık bana

list(itertools.chain(*[item.split() for item in lst])) 

olsaydı ben senin her n'inci elemanı ne anlama geliyor

+1

Merhaba Joran, bunun işe yarayacağından emin misin? Bence liste (itertools.chain (* [item.split() öğesinde lst])) ' –

+0

ahh tamamen senin cevabın netlik açısından daha iyi olduğunu düşünüyorum Yine de düşünüyorum (" bir sınırlayıcı olmadan normal bir bölme ama meh) –

İlgili konular