سؤال

من المفترض أن أكتب برنامجًا يأخذ سلسلة من التعليمات البرمجية الثنائية ورقمًا، ويخرج جميع السلاسل ضمن مسافة التشويش هذه من السلسلة الأصلية.لدي وظيفة تفعل كل شيء، ولكن في الإخراج هناك قوائم داخل القوائم.أفهم سبب ذلك - فالدالة متكررة، وفي بعض الأحيان ستعيد قائمة بالقيم المحتملة.

المشكلة هي أنني لا أعرف كيفية تغييره حتى يخرج سلاسل كاملة.على سبيل المثال، بالنسبة لسلسلة من "0000" ومسافة هامينغ "2"، أحصل على:["1['100', '010', '001']"، "01['10', '01']"، "001['1']"]

لكن ما أريده هو:

1100
1010
1001
0110
0101
0011

الكود أدناه:

def hamming(num, dist):
    if dist == 0:
        return num
    else:
        outputlist = list()
        for item in range(len(num)):
            if len(num[item:]) > dist - 1:
                if num[item] == "0":
                    restoflist = hamming(num[item + 1:], dist - 1)
                    outputlist.append(num[:item] + "1" + str(restoflist))
                else:
                    restoflist = hamming(num[item + 1:], dist - 1)
                    outputlist.append(num[:item] + "0" + str(restoflist))                
        return outputlist
هل كانت مفيدة؟

المحلول

إذا قمت بالتكرار خلال القائمة التي يتم إرجاعها بواسطة hamming يجب أن تكون قادرًا على إلحاق السلاسل معًا بالطريقة الصحيحة - مثل هذا:

def hamming(num, dist):
    if dist == 0:
        return num
    else:
        outputlist = list()
        for item in range(len(num)):
            if len(num[item:]) > dist - 1:
                if num[item] == "0":
                    restoflist = hamming(num[item + 1:], dist - 1)
                    if type(restoflist) is not str
                        for rest in restoflist:
                            outputlist.append(num[:item] + "1" + str(rest))
                    else
                        outputlist.append(num[:item] + "1" + str(restoflist))
                else:
                    restoflist = hamming(num[item + 1:], dist - 1)
                    if type(restoflist) is not str
                        for rest in restoflist:
                            outputlist.append(num[:item] + "0" + str(rest))
                    else
                        outputlist.append(num[:item] + "0" + str(restoflist))                
    return outputlist

نصائح أخرى

يمكنك إصلاحه عن طريق العودة [num] بدلا من ذلك num في الحالة الأساسية، وفي الحالة العامة، قم بدمج النتائج من الاستدعاءات العودية باستخدام map و extend بدلا من append:

def hamming(num, dist):
    if dist == 0:
        return [num]
    else:
        outputlist = list()
        for item in range(len(num)):
            if len(num[item:]) > dist - 1:
                if num[item] == "0":
                    restoflist = hamming(num[item + 1:], dist - 1)
                    outputlist.extend(map(lambda x: num[:item] + "1" + x, restoflist))
                else:
                    restoflist = hamming(num[item + 1:], dist - 1)
                    outputlist.extend(map(lambda x: num[:item] + "0" + x, restoflist))                
        return outputlist

>>> hamming('0000', 2)
['1100', '1010', '1001', '0110', '0101', '0011']
>>> 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top