Có thể phân chia một chuỗi mỗi ký tự thứ n?
Ví dụ: giả sử tôi có một chuỗi chứa các chuỗi sau:
'1234567890'
Làm thế nào tôi có thể làm cho nó trông như thế này:
['12','34','56','78','90']
Đối với cùng một câu hỏi với một danh sách, xem làm thế nào để tôi chia một danh sách thành các khối có kích thước như nhau ?. Các kỹ thuật tương tự thường được áp dụng, mặc dù có một số biến thể.
Karl Knechtel
59.3k10 Huy hiệu vàng86 Huy hiệu bạc130 Huy hiệu đồng10 gold badges86 silver badges130 bronze badges
hỏi ngày 28 tháng 2 năm 2012 lúc 1:48Feb 28, 2012 at 1:48
0
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range[0, len[line], n]]
['12', '34', '56', '78', '90']
Đã trả lời ngày 28 tháng 2 năm 2012 lúc 2:02Feb 28, 2012 at 2:02
4
Chỉ cần hoàn thành, bạn có thể làm điều này với Regex:
>>> import re
>>> re.findall['..','1234567890']
['12', '34', '56', '78', '90']
Đối với số lẻ của ký tự, bạn có thể làm điều này:
>>> import re
>>> re.findall['..?', '123456789']
['12', '34', '56', '78', '9']
Bạn cũng có thể làm như sau, để đơn giản hóa Regex cho các khối dài hơn:
>>> import re
>>> re.findall['.{1,2}', '123456789']
['12', '34', '56', '78', '9']
Và bạn có thể sử dụng
>>> import re
>>> re.findall['..','1234567890']
['12', '34', '56', '78', '90']
0 nếu chuỗi dài để tạo chunk bằng chunk.
Georgy
11K7 Huy hiệu vàng62 Huy hiệu bạc68 Huy hiệu Đồng7 gold badges62 silver badges68 bronze badges
Đã trả lời ngày 28 tháng 2 năm 2012 lúc 6:31Feb 28, 2012 at 6:31
Sói sóithe wolf
33.1K12 Huy hiệu vàng53 Huy hiệu bạc71 Huy hiệu đồng12 gold badges53 silver badges71 bronze badges
5
Đã có một chức năng sẵn có trong Python cho việc này.
>>> from textwrap import wrap
>>> s = '1234567890'
>>> wrap[s, 2]
['12', '34', '56', '78', '90']
Đây là những gì tài liệu cho Wrap nói:
>>> help[wrap]
'''
Help on function wrap in module textwrap:
wrap[text, width=70, **kwargs]
Wrap a single paragraph of text, returning a list of wrapped lines.
Reformat the single paragraph in 'text' so it fits in lines of no
more than 'width' columns, and return a list of wrapped lines. By
default, tabs in 'text' are expanded with string.expandtabs[], and
all other whitespace characters [including newline] are converted to
space. See TextWrapper class for available keyword args to customize
wrapping behaviour.
'''
Đã trả lời ngày 19 tháng 2 năm 2018 lúc 6:57Feb 19, 2018 at 6:57
10
Một cách phổ biến khác để nhóm các yếu tố thành các nhóm độ dài N:
>>> s = '1234567890'
>>> map[''.join, zip[*[iter[s]]*2]]
['12', '34', '56', '78', '90']
Phương pháp này đến trực tiếp từ các tài liệu cho
>>> import re
>>> re.findall['..','1234567890']
['12', '34', '56', '78', '90']
1.Đã trả lời ngày 28 tháng 2 năm 2012 lúc 2:25Feb 28, 2012 at 2:25
Andrew Clarkandrew ClarkAndrew Clark
196K33 Huy hiệu vàng265 Huy hiệu bạc297 Huy hiệu Đồng33 gold badges265 silver badges297 bronze badges
5
Tôi nghĩ rằng điều này ngắn hơn và dễ đọc hơn phiên bản itertools:
def split_by_n[seq, n]:
'''A generator to divide a sequence into chunks of n units.'''
while seq:
yield seq[:n]
seq = seq[n:]
print[list[split_by_n['1234567890', 2]]]
Đã trả lời ngày 28 tháng 2 năm 2012 lúc 1:53Feb 28, 2012 at 1:53
Russell Borogoverussell BorogoveRussell Borogove
17.9k3 Huy hiệu vàng40 Huy hiệu bạc49 Huy hiệu đồng3 gold badges40 silver badges49 bronze badges
2
Sử dụng nhiều iterTools từ Pypi:
['12','34','56','78','90']
0Đã trả lời ngày 22 tháng 6 năm 2017 lúc 10:19Jun 22, 2017 at 10:19
Tim Dielstim DielsTim Diels
3.0582 Huy hiệu vàng18 Huy hiệu bạc22 Huy hiệu đồng2 gold badges18 silver badges22 bronze badges
Tôi thích giải pháp này:
['12','34','56','78','90']
1Đã trả lời ngày 12 tháng 9 năm 2015 lúc 23:14Sep 12, 2015 at 23:14
vlkvlkvlk
2.4113 Huy hiệu vàng31 Huy hiệu bạc33 Huy hiệu Đồng3 gold badges31 silver badges33 bronze badges
Bạn có thể sử dụng công thức
>>> import re
>>> re.findall['..','1234567890']
['12', '34', '56', '78', '90']
2 từ >>> import re
>>> re.findall['..','1234567890']
['12', '34', '56', '78', '90']
3:Python 2.x:
['12','34','56','78','90']
2Python 3.x:
['12','34','56','78','90']
3Các chức năng này có hiệu quả bộ nhớ và hoạt động với bất kỳ phép lặp.
Đã trả lời ngày 3 tháng 10 năm 2015 lúc 20:16Oct 3, 2015 at 20:16
Eugene Yarmasheugene YarmashEugene Yarmash
136K38 Huy hiệu vàng312 Huy hiệu bạc368 Huy hiệu đồng38 gold badges312 silver badges368 bronze badges
1
Điều này có thể đạt được bằng một đơn giản cho vòng lặp.
['12','34','56','78','90']
4Đầu ra trông giống như ['12', '34', '56', '78', '90', 'a']]]
Đã trả lời ngày 22 tháng 5 năm 2020 lúc 18:02May 22, 2020 at 18:02
Kasem777Kasem777Kasem777
5776 Huy hiệu bạc10 Huy hiệu Đồng6 silver badges10 bronze badges
3
Tôi đã bị mắc kẹt trong cùng một kịch bản.
Điều này làm việc cho tôi
['12','34','56','78','90']
5Đầu ra
['12','34','56','78','90']
6Đã trả lời ngày 28 tháng 11 năm 2019 lúc 14:54Nov 28, 2019 at 14:54
StrickstrickStrick
1.3949 huy hiệu bạc15 huy hiệu đồng9 silver badges15 bronze badges
1
Hãy thử mã sau:
['12','34','56','78','90']
7Đã trả lời ngày 28 tháng 2 năm 2012 lúc 1:52Feb 28, 2012 at 1:52
Enderskillenderskillenderskill
6.9983 Huy hiệu vàng23 Huy hiệu bạc23 Huy hiệu đồng3 gold badges23 silver badges23 bronze badges
1
Thử cái này:
['12','34','56','78','90']
8Output:
['12','34','56','78','90']
6Đã trả lời ngày 10 tháng 7 năm 2018 lúc 3:46Jul 10, 2018 at 3:46
U12-ForwardU12-ForwardU12-Forward
66.5K13 Huy hiệu vàng78 Huy hiệu bạc97 Huy hiệu đồng13 gold badges78 silver badges97 bronze badges
0
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range[0, len[line], n]]
['12', '34', '56', '78', '90']
0Đã trả lời ngày 28 tháng 2 năm 2012 lúc 1:56Feb 28, 2012 at 1:56
Ben Wben wben w
2.46212 Huy hiệu bạc17 Huy hiệu đồng12 silver badges17 bronze badges
0
Như mọi khi, đối với những người yêu thích một lớp lót
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range[0, len[line], n]]
['12', '34', '56', '78', '90']
1Đã trả lời ngày 20 tháng 5 năm 2016 lúc 20:00May 20, 2016 at 20:00
SqriptersqripterSqripter
992 Huy hiệu bạc7 Huy hiệu đồng2 silver badges7 bronze badges
4
>>> import re
>>> re.findall['..','1234567890']
['12', '34', '56', '78', '90']
4 đã được đề cập trước đây. Dưới đây là bốn tùy chọn khác từ thư viện >>> import re
>>> re.findall['..','1234567890']
['12', '34', '56', '78', '90']
5: >>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range[0, len[line], n]]
['12', '34', '56', '78', '90']
2Mỗi tùy chọn sau tạo ra đầu ra sau:
['12','34','56','78','90']
6Tài liệu cho các tùy chọn đã thảo luận:
>>> import re
>>> re.findall['..','1234567890']
['12', '34', '56', '78', '90']
6, >>> import re
>>> re.findall['..','1234567890']
['12', '34', '56', '78', '90']
7, >>> import re
>>> re.findall['..','1234567890']
['12', '34', '56', '78', '90']
8, >>> import re
>>> re.findall['..','1234567890']
['12', '34', '56', '78', '90']
9Đã trả lời ngày 9 tháng 2 năm 2018 lúc 1:16Feb 9, 2018 at 1:16
Pylangpylangpylang
36.8k11 Huy hiệu vàng122 Huy hiệu bạc112 Huy hiệu đồng11 gold badges122 silver badges112 bronze badges
0
Một giải pháp đệ quy đơn giản cho chuỗi ngắn:
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range[0, len[line], n]]
['12', '34', '56', '78', '90']
4Hoặc ở dạng như vậy:
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range[0, len[line], n]]
['12', '34', '56', '78', '90']
5, minh họa mô hình phân chia và chinh phục điển hình theo cách tiếp cận đệ quy rõ ràng hơn [mặc dù thực tế không cần thiết phải làm theo cách này]
Đã trả lời ngày 22 tháng 10 năm 2018 lúc 10:25Oct 22, 2018 at 10:25
Đất menenglealuze
1.40511 Huy hiệu bạc17 Huy hiệu đồng11 silver badges17 bronze badges
Một giải pháp với
>>> import re
>>> re.findall['..?', '123456789']
['12', '34', '56', '78', '9']
0:>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range[0, len[line], n]]
['12', '34', '56', '78', '90']
6Output:
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range[0, len[line], n]]
['12', '34', '56', '78', '90']
7Đã trả lời ngày 23 tháng 7 năm 2021 lúc 23:08Jul 23, 2021 at 23:08
TigerTV.ruTigerTV.ruTigerTV.ru
1.0482 Huy hiệu vàng14 Huy hiệu bạc33 Huy hiệu đồng2 gold badges14 silver badges33 bronze badges
Những câu trả lời này đều tốt đẹp và hoạt động và tất cả, nhưng cú pháp rất khó hiểu ... tại sao không viết một chức năng đơn giản?
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range[0, len[line], n]]
['12', '34', '56', '78', '90']
8Và gọi nó đơn giản:
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range[0, len[line], n]]
['12', '34', '56', '78', '90']
9Đã trả lời ngày 22 tháng 7 lúc 9:12Jul 22 at 9:12
1