Apakah mungkin untuk membagi string setiap karakter ke-n?
Misalnya, saya memiliki string yang berisi yang berikut ini:
'1234567890'
Bagaimana saya bisa membuatnya terlihat seperti ini:
['12','34','56','78','90']
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range(0, len(line), n)]
['12', '34', '56', '78', '90']
Agar lengkap, Anda bisa melakukan ini dengan regex:
Untuk jumlah karakter ganjil, Anda dapat melakukan ini:
Anda juga dapat melakukan hal berikut, untuk menyederhanakan regex untuk potongan yang lebih lama:
Dan Anda dapat menggunakan
re.finditer
jika string tersebut panjang untuk menghasilkan chunk by chunk.sumber
'.'*n
untuk membuatnya lebih jelas. Tidak ada yang bergabung, tidak ada zip, tidak ada loop, tidak ada pemahaman daftar; temukan saja dua karakter berikutnya di sebelah satu sama lain, yang persis bagaimana otak manusia memikirkannya. Jika Monty Python masih hidup, dia akan menyukai metode ini!flags=re.S
.Sudah ada fungsi inbuilt di python untuk ini.
Ini adalah apa yang dikatakan docstring untuk wrap:
sumber
wrap
mungkin tidak mengembalikan apa yang diminta jika string berisi ruang. misalnyawrap('0 1 2 3 4 5', 2)
pengembalian['0', '1', '2', '3', '4', '5']
(elemen dilucuti)Cara umum lainnya untuk mengelompokkan elemen ke dalam grup n-length:
Metode ini datang langsung dari dokumen untuk
zip()
.sumber
zip(*[iter(s)]*2)
sulit untuk dipahami, baca Bagaimana carazip(*[iter(s)]*n)
kerjanya di Python? .>>> map(''.join, zip(*[iter('01234567')]*5))
->['01234']
zip()
denganitertools.zip_longest()
:map(''.join, zip_longest(*[iter(s)]*2, fillvalue=''))
maps()
Saya pikir ini lebih pendek dan lebih mudah dibaca daripada versi itertools:
sumber
Saya suka solusi ini:
sumber
Menggunakan more-itertools dari PyPI:
sumber
Anda bisa menggunakan
grouper()
resep dariitertools
:Python 2.x:
Python 3.x:
Fungsi-fungsi ini hemat memori dan berfungsi dengan semua iterables.
sumber
Coba kode berikut:
sumber
yield ''.join(piece)
untuk membuatnya berfungsi seperti yang diharapkan: eval.in/813878sumber
Coba ini:
Keluaran:
sumber
Seperti biasa, untuk mereka yang suka one liners
sumber
print(line)
saya dapatkanthis is a line split into n characters
sebagai output. Mungkin Anda lebih baik menempatkan:line = [line[i * n:i * n+n] for i,blah in enumerate(line[::n])]
? Perbaiki ini dan ini jawaban yang bagus :).,blah
dan mengapa itu perlu? Saya perhatikan saya dapat menggantiblah
dengan karakter alfa apa pun, tetapi bukan angka, dan tidak dapat menghapusblah
atau / dan koma. Editor saya menyarankan menambahkan spasi putih setelah,
: senumerate
mengembalikan dua iterables, jadi Anda perlu dua tempat untuk meletakkannya. Tetapi Anda sebenarnya tidak membutuhkan iterable kedua untuk apa pun dalam kasus ini.blah
saya lebih suka menggunakan underscore atau double underscore, lihat: stackoverflow.com/questions/5893163/…Solusi rekursif sederhana untuk string pendek:
Atau dalam bentuk seperti itu:
, yang menggambarkan pola pembagian dan penaklukan yang khas dalam pendekatan rekursif secara lebih eksplisit (meskipun secara praktis tidak perlu dilakukan dengan cara ini)
sumber
Saya terjebak dalam skenario yang sama.
Ini berhasil untuk saya
Keluaran
sumber
more_itertools.sliced
telah disebutkan sebelumnya. Berikut adalah empat opsi lagi darimore_itertools
perpustakaan:Masing-masing opsi terakhir menghasilkan output berikut:
Dokumentasi untuk opsi yang dibahas:
grouper
,chunked
,windowed
,split_after
sumber
Ini dapat dicapai dengan loop sederhana.
Outputnya terlihat seperti ['12', '34', '56', '78', '90', 'a']
sumber