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

تقسيم نص لعدد معين من الحروف في بايثون

Fahmy Mostafa

السؤال

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

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

'0123456789'

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

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

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

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

كما يمكن استخدام التعابير المنتظمة regular expression :

import re

num_str = '123456'

chunks = re.findall('\d{2}',num_str) # بحث عن أي سلسلة جزئية من أرقام طول رقمين

print(chunks)

حيث d تعبر عن digit أي رقم 0-9

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...