【问题标题】:I am unable to loop through full l2 list我无法遍历完整的 l2 列表
【发布时间】:2019-06-14 19:31:14
【问题描述】:

我正在尝试创建一个函数来解决以下问题:完成函数 scramble(str1, str2),如果 str1 字符的一部分可以重新排列以匹配 str2,则返回 true,否则返回 false。

def scramble(s1, s2):
    l1 = list(s1)
    l2 = list(s2)
    l3 = l2
    for i in l2:
        for j in l1:
            if i == j:
                l1.remove(j)
                l3.remove(i)
                break

    if l3 == []:
        return True
    else:
        return False

我在尝试随机测试时得到了错误的结果。 我不知道为什么代码没有遍历完整的 l2 列表。 请帮忙。

【问题讨论】:

  • return l3 之后的代码永远不会运行。另外我认为这个算法不能满足要求。
  • 您给出的代码似乎是错误的,因为 return l3 后什么都不会运行

标签: python python-3.x list


【解决方案1】:

嘿,当您从列表中删除时使用删除更容易。 不需要l3,你检查列表是否包含数字 然后找到索引然后删除。 您不返回 l2,因为如果 l2 为空,它将返回 false。 这就是为什么不使用

希望有帮助!

l1 = [1,2,4,5,3]
l2 = [3,4,9,5,3]


for number in l1:
    if l2.__contains__(number):
        index = l2.index(number)
        del l2[index]

return not l2

要删除所有出现的值,只需像这样使用 set sub 即可: set 将删除重复值。并通过使用 list(s1-s2) 您将删除显示的值:

l1 = [1, 2, 3, 1, 2, 5, 6, 7, 8]
l1
[1, 2, 3, 1, 2, 5, 6, 7, 8]
list(set(l1))
[1, 2, 3, 5, 6, 7, 8]
l2 = [1, 2, 3]
list(set(l1) - set(l2))
[8, 5, 6, 7]

【讨论】:

  • 运行 l2 后将是 = [9,3] 它将是剩下的。除非你想删除它自己的号码。当它出现时。据我了解,您只想删除一次。
【解决方案2】:

您可以简单地使用all 来查找是否所有s1 项目都在s2 中,如下所示:

def scramble(s1, s2):
    return all([i in s2 for i in s1])

一些例子:

In [26]: scramble([],[])
Out[26]: True

In [27]: scramble([1],[])
Out[27]: False

In [28]: scramble([1],[1])
Out[28]: True

In [29]: scramble([1],[1,2])
Out[29]: True

In [30]: scramble([1,2],[1,2])
Out[30]: True

In [31]: scramble([1,2,3],[1,2])
Out[31]: False

In [32]: scramble([1,2,3],[3,1,2])
Out[32]: True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2020-12-16
    • 2023-03-06
    • 1970-01-01
    • 2020-02-24
    • 2011-12-19
    相关资源
    最近更新 更多