إلحاق القائمة والتكرار (مسافة هامينغ) - بايثون 3
-
23-12-2019 - |
سؤال
من المفترض أن أكتب برنامجًا يأخذ سلسلة من التعليمات البرمجية الثنائية ورقمًا، ويخرج جميع السلاسل ضمن مسافة التشويش هذه من السلسلة الأصلية.لدي وظيفة تفعل كل شيء، ولكن في الإخراج هناك قوائم داخل القوائم.أفهم سبب ذلك - فالدالة متكررة، وفي بعض الأحيان ستعيد قائمة بالقيم المحتملة.
المشكلة هي أنني لا أعرف كيفية تغييره حتى يخرج سلاسل كاملة.على سبيل المثال، بالنسبة لسلسلة من "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']
>>>