我被分配编写一个接受两个列表的函数,如果另一个列表是另一个列表的循环置换,则返回True。 我写了一个函数,接受两个列表并在第一个和最后一个位置之间进行更改。之后我编写了一个函数,使用for循环调用第一个函数,并在循环结束时返回True,如果每个i都为真。 我尝试运行代码,我遇到了几个错误消息:
文件“C:/WinPython-64bit-3.5.2.2Qt5/settings/.spyder-py3/temp.py”,第13行,循环 if change_position(lst1,lst2):
文件“C:/WinPython-64bit-3.5.2.2Qt5/settings/.spyder-py3/temp.py”,第5行,在change_position中 lst3 [0] = lst4 [len(lst4)]
这是我的代码:
def change_position(lst3, lst4):
if len(lst3) != len(lst4):
print(False)
else:
lst3[0] = lst4[len(lst4)]
def cyclic(lst1, lst2):
if len(lst1) != len(lst2):
print(False)
else:
for i in range(len(lst1)):
if change_position(lst1, lst2):
print(True)
else:
print(False)
cyclic([1, 2, 3, 4], [4, 1, 2, 3])
有谁知道我如何解决这个问题,这个功能会起作用吗? 提前感谢您的所有帮助。
答案 0 :(得分:0)
无需重新排序列表,只需进行索引计算
def is_cyc_perm (list1, list2):
if len (list1) == len (list2):
for shift in range (len (list1)):
for i in range (len (list1)):
if list1 [i] != list2 [(i + shift) % len (list1)]:
break
else:
return True
else:
return False
else:
return False
print (is_cyc_perm ([8, 2, 5, 7], [8, 2, 5, 7]))
print (is_cyc_perm ([7, 8, 2, 5], [8, 2, 5, 7]))
print (is_cyc_perm ([2, 5, 7, 8], [8, 2, 5, 7]))
print (is_cyc_perm ([8, 5, 2, 7], [8, 2, 5, 7]))
print (is_cyc_perm ([7, 2, 5, 8], [8, 2, 5, 7]))
print (is_cyc_perm ([8, 2, 5, 3], [8, 2, 5, 7]))
答案 1 :(得分:0)
列表索引从0开始,你应该使用range(0,len(list)-1)。
def change_position(lst3, lst4):
if len(lst3) != len(lst4):
print(False)
else:
lst3[0] = lst4[len(lst4)-1]
def cyclic(lst1, lst2):
if len(lst1) != len(lst2):
print(False)
else:
for i in range(len(lst1)-1):
if change_position(lst1, lst2):
print(True)
else:
print(False)
答案 2 :(得分:0)
使用指针快速旋转双链表是一种快速操作。如果匹配,您可以尝试所有旋转。
集合模块还提供Counter
,如果两个列表具有相同元素的相同计数,则可以用于快速测试。它只是明显相同长度检查的更强版本。
import collections
def is_cyc_perm(seq1, seq2):
mset1 = collections.Counter(seq1)
mset2 = collections.Counter(seq2)
if mset1 != mset2:
return False
size = len(seq1)
deq1 = collections.deque(seq1)
deq2 = collections.deque(seq2)
for _ in range(size):
deq2.rotate()
if deq1 == deq2:
return True
return False