1

寻找关于我的代码和想法是否有效的建议,或者我应该尝试不同的方法。我不是在寻找完整的答案,而是在寻找提示。一个简单的“继续/尝试”或“尝试其他东西”就足够了。

我有两个函数参数,都是列表。它们的长度必须相等才能进行比较,否则程序返回 False。

index 中的对象i被移动到 index (i+m)%k,其中k是列表的长度,以及mindex 中的项目移动了多少i

我的想法是这样的:

从长度的两个列表中k,我会单独检查每个索引,如果发现索引已经移动(i+m)%k,它会添加1到计数器中。

大小为 3 的列表有 3 种循环排列的可能性,因此如果计数器命中3,它将返回 a True

def cyclic(lst1, lst2):
    number_success = 0
    if len(lst1) == len(lst2):  # checks to see if lists are equal length
        for i in range(len(lst1)): # starts with i index to check each spot
            for j in range(len(lst1)):  # starts with j index to test cycling
                if lst1[i] == lst2[(i+j)%len(lst1)]:
                    number_success += 1
                else:
                    continue
        if number_success == len(lst1):
            return(True)
        else:
            return(False)
    else:
        print("idiot")
4

3 回答 3

1

将 lst1 与自身连接如何,然后检查 lst2 是否在 lst1 中找到?作为使用字符串的说明:

lst1="1234"
lst2="2341"
if lst2 in lst1+lst1:
    print "yup"
else:
    print "nope"
于 2016-11-24T16:41:48.563 回答
1

有问题的更正代码:

def cyclic(lst1, lst2):
    number_success = 0
    if len(lst1) == len(lst2):  # checks to see if lists are equal length
        for j in range(len(lst1)): # starts with j index to test cycling
            for i in range(len(lst1)):  # starts with i index to check each spot
                if lst1[i] == lst2[(i+j)%len(lst1)]:
                    number_success += 1
            if number_success == len(lst1):
                return True
        return False
    else:
        print("idiot")
于 2016-11-24T15:05:03.717 回答
0

您的算法将不起作用。您正在将每个项目lst1与其中的每个项目进行比较lst2并累积匹配项。您的方法不考虑项目的顺序。你本质上是在做

set(lst1) == set(lst2)

我在内部循环中添加了一个打印语句来观察发生了什么。当我试图弄清楚我在做什么时,我发现打印变量、计算和比较结果是有效的。

print(lst1[i], lst2[(i+j)%len(lst1)], lst1[i] == lst2[(i+j)%len(lst1)])

您可以通过比较两个列表来检查,如果它们相等则有一个循环,如果它们不相等,则旋转一个列表并重复,如果在 len(list) 旋转后没有匹配则没有循环。像这样的东西

...代码已删除...

于 2016-11-24T16:16:41.450 回答