【问题标题】:Checking if from two given lists, one is a cyclic permutation of the other检查两个给定列表中的一个是否是另一个的循环排列
【发布时间】:2017-04-08 21:55:12
【问题描述】:

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

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

索引i 中的对象被移动到索引(i+m)%k,其中k 是列表的长度,m 是索引i 中的项目移动了多少。

我的想法是这样的:

从长度为k的两个列表中,我会分别检查每个索引,如果发现索引被移动了(i+m)%k,则将1添加到计数器中。

大小为 3 的列表有 3 种循环排列的可能性,因此如果计数器命中 3,它将返回 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")

【问题讨论】:

  • 如果列表中的元素匹配,则返回 True,与它们的排序方式无关,因为 if 检查是在两个循环之外完成的。
  • 我对循环排列一无所知,所以我做了一些简短的阅读;您确定 3 个列表有 3 个可能的循环排列吗?他们不会是{1,2}{2,3}{1,3}{1,2,3}(4 种可能性)吗?
  • @Adirio 你是对的。它似乎只适用于长度为 3 的列表。投入长度为 4 的列表会给我错误的返回
  • @lucasnadalutti 只检查列表中的数字
  • @RonaldB 尝试再缩进这两行:if number_succes == len(lst1):return(True)。 else 子句保持原样。

标签: python loops cyclic


【解决方案1】:

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

set(lst1) == set(lst2)

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

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

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

...代码已删除...

【讨论】:

    【解决方案2】:

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

    lst1="1234"
    lst2="2341"
    if lst2 in lst1+lst1:
        print "yup"
    else:
        print "nope"
    

    【讨论】:

      【解决方案3】:

      有问题的更正代码:

      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")
      

      【讨论】:

      • 嗨,Adirio,虽然我很欣赏修复并会竖起大拇指,但我只是想要一个小建议或朝正确的方向戳。我不会看代码或使用它,但我相信你是一个有能力的程序员,这确实是解决方案。
      • @RonaldB 这可以进一步改进,例如计算匹配数并返回 True 效率低于如果发现未匹配则打破内循环
      猜你喜欢
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      相关资源
      最近更新 更多