سؤال

النظر في "السلسلة" (تعامل معها كمجموعة من الأرقام)

0 0 1 8 8 8 1 0

RLE ("Groupby") هو:

[(0,2), (1, 1), (8,3), (1, 1), (0, 1)]

ثم نثري RLE أعلاه مع مجموع أطوال تشغيل العناصر السابقة.

وبالتالي ، تصبح النسخة المخصبة لما سبق:

[(0, (0,2)), (0+2, (1, 1)), (0+2+1, (8,3)), (0+1+2+3, (1, 1)), (0+1+2+3+1, (0, 1))]

تقسيم "السلسلة" في 1:

0 0 , 8 8 8 , 0

انقسام RLE على 1

[(0,2)] , [(8,3)] , [(0, 1)]

تقسيم "السلسلة" في 8:

0 0 1 , , , 1 0

انقسام RLE في 8

[(0,2), (1, 1)] , , , [(1, 1), (0, 1)]

ملاحظة: في أمثلةي ، استشهدت بقوائم "RLE Split On Z" دون إثراءها. هذا لن يكون كذلك. تركتهم للحد من الفوضى. على سبيل المثال ، يجب معاملة "RLE Split on 1" على النحو التالي:

[(0, (0,2))] , [(0+2+1, (8,3))] , [(0+1+2+3+1, (0, 1)]

كيف يمكنني تحقيق هذا "تقسيم RLE" على z (= 1 ، 8 ؛ في هذه الحالة)

من الجيد ترك المصفوفات الفارغة (بعد الانقسام).

ربما قائمة ذكية شركات.؟ (يبدو من الأسهل قليلاً حل مع حلقة مع إلحاق متداخل داخل)

هل كانت مفيدة؟

المحلول

فقط لإظهار ما كيف ، أنصحك بشدة بعدم استخدام هذا

الطريق القبيح "الأنيق":

>>> data
[0, 0, 1, 8, 8, 8, 4, 4, 1, 0]
>>> def fromDataToSplitRLE(dat,n):
    RLE=[(k,len(tuple(g))) for k,g in itertools.groupby(dat)]
    tmp=tuple(zip(*RLE))
    return [list(g) for k,g in itertools.groupby((zip((sum(tmp[1][:i]) for i in range(len(tmp[1]))) ,(zip(*tmp)))),lambda x:x[1][0]!=n) if k]

>>> fromDataToSplitRLE(data,1)
[[(0, (0, 2))], [(3, (8, 3)), (6, (4, 2))], [(9, (0, 1))]]

نصائح أخرى

import itertools

def get_rle(list_of_digits, split_on=None):
    count = 0
    rle = []
    active_group = []
    rle_app = rle.append
    for item, group in itertools.groupby(list_of_digits):
        L = len(list(group))
        if item == split_on:
            rle_app(active_group)
            active_group = []
        else:
            active_group.append((count, (item, L)))
        count += L

    rle_app(active_group)
    return rle

list_of_digits = map(int, '0 0 1 8 8 8 1 0'.split())
print get_rle(list_of_digits)
print get_rle(list_of_digits, 8)
print get_rle(list_of_digits, 1)

aaron@aaron-laptop:~/code/tmp$ python rle.py
[[(0, (0, 2)), (2, (1, 1)), (3, (8, 3)), (6, (1, 1)), (7, (0, 1))]]
[[(0, (0, 2)), (2, (1, 1))], [(6, (1, 1)), (7, (0, 1))]]
[[(0, (0, 2))], [(3, (8, 3))], [(7, (0, 1))]]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top