เป็นไปได้ไหมที่จะแบ่งสตริงทุกอักขระที่ n?
ตัวอย่างเช่นสมมติว่าฉันมีสตริงที่มีสิ่งต่อไปนี้:
'1234567890'
ฉันจะทำให้มันเป็นแบบนี้ได้อย่างไร:
['12','34','56','78','90']
เป็นไปได้ไหมที่จะแบ่งสตริงทุกอักขระที่ n?
ตัวอย่างเช่นสมมติว่าฉันมีสตริงที่มีสิ่งต่อไปนี้:
'1234567890'
ฉันจะทำให้มันเป็นแบบนี้ได้อย่างไร:
['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']
เพื่อให้เสร็จสมบูรณ์คุณสามารถทำได้ด้วย regex:
>>> import re
>>> re.findall('..','1234567890')
['12', '34', '56', '78', '90']
สำหรับจำนวนตัวอักษรคี่คุณสามารถทำสิ่งนี้:
>>> import re
>>> re.findall('..?', '123456789')
['12', '34', '56', '78', '9']
คุณยังสามารถทำสิ่งต่อไปนี้เพื่อทำให้ regex ง่ายขึ้นสำหรับชิ้นส่วนที่ยาวกว่า:
>>> import re
>>> re.findall('.{1,2}', '123456789')
['12', '34', '56', '78', '9']
และคุณสามารถใช้re.finditer
ถ้าสตริงมีความยาวในการสร้างชิ้นโดยชิ้น
'.'*n
เพื่อให้ชัดเจนยิ่งขึ้น ไม่มีการเข้าร่วมไม่มีซิปไม่มีลูปไม่มีรายการเข้าใจ เพียงแค่ค้นหาตัวละครสองตัวถัดไปซึ่งอยู่ติดกันซึ่งเป็นสิ่งที่สมองมนุษย์คิด หาก Monty Python ยังมีชีวิตอยู่เขาจะชอบวิธีนี้!
flags=re.S
นี้
มีฟังก์ชั่น inbuilt ในหลามสำหรับสิ่งนี้
>>> from textwrap import wrap
>>> s = '1234567890'
>>> wrap(s, 2)
['12', '34', '56', '78', '90']
นี่คือสิ่งที่ docstring สำหรับการตัดพูดว่า:
>>> 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.
'''
wrap
อาจไม่ส่งคืนสิ่งที่ถูกถามถ้าสตริงมีช่องว่าง เช่นwrap('0 1 2 3 4 5', 2)
ผลตอบแทน['0', '1', '2', '3', '4', '5']
(องค์ประกอบถูกปล้น)
อีกวิธีการทั่วไปของการจัดกลุ่มองค์ประกอบเป็นกลุ่มความยาว n:
>>> s = '1234567890'
>>> map(''.join, zip(*[iter(s)]*2))
['12', '34', '56', '78', '90']
zip()
วิธีการนี้มาตรงจากเอกสารสำหรับ
zip(*[iter(s)]*2)
เรื่องยุ่งยากที่จะเข้าใจอ่านอย่างไรzip(*[iter(s)]*n)
ในการทำงานในงูใหญ่? .
>>> map(''.join, zip(*[iter('01234567')]*5))
->['01234']
zip()
ด้วยitertools.zip_longest()
:map(''.join, zip_longest(*[iter(s)]*2, fillvalue=''))
ฉันคิดว่านี่สั้นและอ่านง่ายกว่ารุ่น 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)))
ฉันชอบวิธีนี้:
s = '1234567890'
o = []
while s:
o.append(s[:2])
s = s[2:]
ใช้มากขึ้น - itertoolsจาก PyPI:
>>> from more_itertools import sliced
>>> list(sliced('1234567890', 2))
['12', '34', '56', '78', '90']
คุณสามารถใช้grouper()
สูตรจากitertools
:
from itertools import izip_longest
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
from itertools import zip_longest
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
ฟังก์ชั่นเหล่านี้มีหน่วยความจำที่มีประสิทธิภาพและทำงานกับ iterables ใด ๆ
ลองรหัสต่อไปนี้:
from itertools import islice
def split_every(n, iterable):
i = iter(iterable)
piece = list(islice(i, n))
while piece:
yield piece
piece = list(islice(i, n))
s = '1234567890'
print list(split_every(2, list(s)))
yield ''.join(piece)
เพื่อให้ทำงานตามที่คาดไว้: eval.in/813878
>>> from functools import reduce
>>> from operator import add
>>> from itertools import izip
>>> x = iter('1234567890')
>>> [reduce(add, tup) for tup in izip(x, x)]
['12', '34', '56', '78', '90']
>>> x = iter('1234567890')
>>> [reduce(add, tup) for tup in izip(x, x, x)]
['123', '456', '789']
ลองสิ่งนี้:
s='1234567890'
print([s[idx:idx+2] for idx,val in enumerate(s) if idx%2 == 0])
เอาท์พุท:
['12', '34', '56', '78', '90']
เช่นเคยสำหรับผู้ที่รักหนึ่งสมุทร
n = 2
line = "this is a line split into n characters"
line = [line[i * n:i * n+n] for i,blah in enumerate(line[::n])]
print(line)
ฉันได้this is a line split into n characters
ผลลัพธ์เป็น คุณอาจจะดีกว่าการวาง: line = [line[i * n:i * n+n] for i,blah in enumerate(line[::n])]
? แก้ไขปัญหานี้และเป็นคำตอบที่ดี :)
,blah
ได้หรือไม่และทำไมจึงจำเป็น ฉันสังเกตเห็นว่าฉันสามารถแทนที่blah
ด้วยตัวอักษร / s ตัวใดตัวหนึ่ง แต่ไม่ใช่ตัวเลขและไม่สามารถลบblah
หรือ / และเครื่องหมายจุลภาค บรรณาธิการของฉันแนะนำให้เพิ่มช่องว่างหลังจาก,
: s
enumerate
ส่งกลับสองค่า iterables ดังนั้นคุณต้องสองสถานที่เพื่อวาง แต่คุณไม่ต้องการการทำซ้ำครั้งที่สองสำหรับทุกสิ่งในกรณีนี้
blah
ฉันต้องการใช้ขีดเส้นใต้หรือขีดเส้นใต้คู่ดู: stackoverflow.com/questions/5893163/…
โซลูชันแบบเรียกซ้ำง่ายๆสำหรับสตริงแบบสั้น:
def split(s, n):
if len(s) < n:
return []
else:
return [s[:n]] + split(s[n:], n)
print(split('1234567890', 2))
หรือในรูปแบบดังกล่าว:
def split(s, n):
if len(s) < n:
return []
elif len(s) == n:
return [s]
else:
return split(s[:n], n) + split(s[n:], n)
ซึ่งแสดงให้เห็นถึงรูปแบบการแบ่งแยกและพิชิตโดยทั่วไปในแนวทางแบบวนซ้ำอย่างชัดเจนยิ่งขึ้น (แม้ว่าจะไม่จำเป็นต้องทำแบบนี้)
ฉันติดอยู่ใน Scenrio เดียวกัน
สิ่งนี้ใช้ได้สำหรับฉัน
x="1234567890"
n=2
list=[]
for i in range(0,len(x),n):
list.append(x[i:i+n])
print(list)
เอาท์พุต
['12', '34', '56', '78', '90']
more_itertools.sliced
ได้รับการกล่าวถึงก่อน ที่นี่มีสี่ตัวเลือกเพิ่มเติมจากmore_itertools
ห้องสมุด:
s = "1234567890"
["".join(c) for c in mit.grouper(2, s)]
["".join(c) for c in mit.chunked(s, 2)]
["".join(c) for c in mit.windowed(s, 2, step=2)]
["".join(c) for c in mit.split_after(s, lambda x: int(x) % 2 == 0)]
แต่ละตัวเลือกหลังผลิตผลลัพธ์ต่อไปนี้:
['12', '34', '56', '78', '90']
เอกสารสำหรับตัวเลือกที่กล่าวถึง: grouper
, chunked
, windowed
,split_after
สามารถทำได้โดยง่ายสำหรับการวนซ้ำ
a = '1234567890a'
result = []
for i in range(0, len(a), 2):
result.append(a[i : i + 2])
print(result)
ผลลัพธ์ดูเหมือนว่า ['12', '34', '56', '78', '90', 'a']