确定两个列表是否是彼此的循环排列

时间:2016-11-27 17:41:12

标签: python

我被分配编写一个接受两个列表的函数,如果另一个列表是另一个列表的循环置换,则返回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])

有谁知道我如何解决这个问题,这个功能会起作用吗? 提前感谢您的所有帮助。

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