2011-06-16 19 views
6

Temel bir soruya takıldım. Bir öğe, ['111111111122222222223333333333'] içeren bir liste vermek Örneğin 10 bir charater uzunluğunda her bir öğe listesini almak ve birçok öğe listesi bölmek çalışıyorum, çıktı üretecektir:Bir liste veya dizgeyi sabit uzunluktaki parçalara ayrıştırmak için nasıl

1111111111 
2222222222 
3333333333 

Bunun çok basit olduğunu hissediyorum, ama çok şaşırdım. Bu gibi bir işlev oluşturmaya çalıştım: Bu işe yaramıyor. Herhangi bir tavsiye? Bir string kullanmak bir listeden daha mı kolay olur?

+0

sen Tekrar anlatabilirim bu edin: 'Ben alamadım characters.' 10 alt listelere n uzunlukta bir listesi üzerinden yineleme çalışıyorum. – mouad

+0

@mouad açıklık için düzenlenmiş, umarım yardımcı oldu. – drbunsen

+0

Yazım için başlığı düzenleyin. Ayrıca, dizininizin bir listenin içinde olması gerekmez. Ayrıca, sorunuzu henüz cevaplamadım mı? (aşağıya bakınız) –

cevap

9

İlgili bir soru sorulmuş: Slicing a list into a list of sub-lists

Örneğin, kaynak listesi ise:

the_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, ... ] 

hoşuna bölebilirsiniz:

split_list = [the_list[i:i+n] for i in range(0, len(the_list), n)] 

varsayarak n senin alt liste uzunluğu ve sonuç şöyle olur:

[[1, 2, 3, ..., n], [n+1, n+2, n+3, ..., 2n], ...] 

Sonra hoşuna yineleyebilirsiniz:

for sub_list in split_list: 
    # Do something to the sub_list 

aynı şey dizeleri için de geçerli.

İşte pratik bir örnek:

>>> n = 2 
>>> listo = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> split_list = [listo[i:i+n] for i in range(0, len(listo), n)] 
>>> split_list 
[[1, 2], [3, 4], [5, 6], [7, 8], [9]] 

>>> listo = '123456789' 
>>> split_list = [listo[i:i+n] for i in range(0, len(listo), n)] 
>>> split_list 
['12', '34', '56', '78', '9'] 
+0

teşekkürler, tam olarak ihtiyacım olan buydu. yardımınız için çok minnettarım! – drbunsen

1

Kullanım:

bu soru 4 yıl sonra yayınlanmıştır, ama burada bu kullanılmasını textwrap module yapmak için bir başka yoludur olmasına rağmen
value = '111111111122222222223333333333' 
n = 10 
(value[i:i+n] for i in xrange(0, len(value), n)) 
1

. dokümandan:

textwrap.wrap(text[, width[, ...]])

sarar metinde tek paragraf (bir dize) dolayısıyla her satır uzunluğunda en genişlik karakterdir. Son satırlar olmadan çıktı satırlarının bir listesini döndürür.

Opsiyonel anahtar kelime argümanlar aşağıda belgelenen TextWrapper örneği niteliklerini, karşılık gelmektedir. genişlik varsayılanı 70'tir.

yüzden böyle yapabilirsiniz:

>>> import textwrap 
>>> myList = ['111111111122222222223333333333'] 

>>> [i for text in myList for i in textwrap.wrap(text, 10)] 
['1111111111', '2222222222', '3333333333'] 

>>> for i in [i for text in myList for i in textwrap.wrap(text, 10)]: 
...  print i 
1111111111 
2222222222 
3333333333 
>>> 
0

diğer yolları yinelemeli bunu yapmak için:

Seçenek 1: Rekürsif fonksiyonu

>>> def chunks(x, n=10): 
...  if len(x) <= n: 
...   return [x] 
...  else: 
...   return [x[:n]] + chunks(x.replace(x[:n], '')) 
... 
>>> seq = ['111111111122222222223333333333'] 
>>> print chunks(seq[0]) 
['1111111111', '2222222222', '3333333333'] 

Seçenek 2: Özyineleşmiş lambda

>>> n = 10 
>>> chunks = lambda x: [x] if len(x) <= n else [x[:n]] + chunks(x.replace(x[:n], '')) 
>>> print chunks(seq[0]) 
['1111111111', '2222222222', '3333333333'] 
İlgili konular