اذهب إلى المحتوى

السؤال

نشر

هل من الممكن تقسيم سلسلة إلى عدد معين من الحروف؟

على سبيل المثال تقسيم النص التالي:

'0123456789'

لأحصل على التالي:

['01', '12', '23', '34', ….]

حاولت أن أستعمل دالة split لكن لا يوجد رقم مكرر لكي أقوم بتقسيم النص بناءً عليه

Recommended Posts

  • 0
نشر

يمكننا فعل ذلك من خلال تعريف قائمة فارغة, ثم المرور على جميع عناصر السلسلة من خلال استخدام حلقة التكرار for وبداخل الحلقة نستخدم الدالة append, فيكون شكل الكود كالتالي

str1 = '123456789'#السلسلة التي نريد تقسيمها
myList = []#قمنا بتعريف قائمة فارغة

for i in range(0, len(str1), 2):#حلقة للمرور على جميع عناصر السلسلة
    myList.append(str1[i : i + 2])# نقوم باضافة العناصر التي مررنا عليهاالى القائمة
print(myList)#طباعة القائمة

 

  • 0
نشر

توجد دالة في لغة بايثون تقوم بالفكرة التي تريد تنفيذها وهي wrap من textwrap ويمكنك استخدامها كالتالي 

from textwrap import wrap #لاتنسى استدعائها أولاً
s = '1234567890'
wrap(s, 2) # نمرر أولاً النص ثم نمرر العرض أو عدد الحروف التي تريدها

#الناتج
# ['12', '34', '56', '78', '90']

  • 0
نشر

هذا مُولد للحصول على الأجزاء التي تريدها

def chunks(lst, n):
    for i in range(0, len(lst), n):
        yield lst[i:i + n]
# يمكنك إستخدامها كالتالي
import pprint
pprint.pprint(list(chunks(range(10, 75), 10)))

اما إذا كنت تستخدم بايثون إصدار 2 فيجب عليك إستخدام ()xrange بدلاً من ()range كما هو موضح في الكود

def chunks(lst, n):
    for i in xrange(0, len(lst), n):
        yield lst[i:i + n]

 

  • 0
نشر

طرق أخرى:
من خلال إنشاء مكرر على السلسلة بداخل الدالة map:

list(map(''.join, zip(*[iter(s)]*2)))

أو من خلال الدالة sliced:

from more_itertools import sliced
list(sliced(s, 2))

أو بالطريقة التالية من خلال الحلقات:

s = '1234567890'
n = 2
li=[s[i:i+n] for i in range(0, len(s), n)]
li
#['12', '34', '56', '78', '90']

للماقارنة بين كل الطرق السابقة:

%timeit li=[s[i:i+n] for i in range(0, len(s), n)]
%timeit list(map(''.join, zip(*[iter(s)]*2))) # الأفضل
%timeit list(sliced(s, 2))
%timeit wrap(s, 2) # الأسوأ
%timeit re.findall('\d{2}',s) # الأفضل
"""
100000 loops, best of 5: 8.76 µs per loop
100000 loops, best of 5: 4.85 µs per loop
100000 loops, best of 5: 11 µs per loop
10000 loops, best of 5: 110 µs per loop
100000 loops, best of 5: 3.74 µs per loop
"""

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...