python:确定列表A是否包含与列表B不同的值

时间:2017-10-27 23:52:41

标签: python iteration

我正在尝试确定列表 CustomerMsg.Body = string.Empty; using (StreamReader reader = new StreamReader(Server.MapPath("~/Templates/Email.html"))) { CustomerMsg.Body = reader.ReadToEnd(); } CustomerMsg.Body = CustomerMsg.Body.Replace("{name}", model.Name.ToUpper()); 是否包含与其他两个值不同的值,这些值构成列表AB0):< / p>

1

这是我到目前为止所拥有的,但我觉得有一个很好的单行或一般效率更高的方式:

[0, 1, 0, 1, 0]  # False
[0, 0, 0, 0, 0]  # False
[1, 1, 1, 1, 1]  # False
[0, 1, 0, 2, 0]  # True

2 个答案:

答案 0 :(得分:3)

您可以将set.issubset()用于此目的。

if not set(A).issubset(B):
    print("True")
else:
    print("False")

输入:

A = [0, 1, 0, 2, 0]
B = [0, 1]

输出:True

输入:

A = [0, 1, 0, 1, 0]
B = [0, 1]

输出:False

答案 1 :(得分:1)

解决方案的复杂性至多是线性的,这意味着在最坏的情况下,您必须检查列表中的所有项目。然而,那是最差的情况。因此,如果性能问题,您可以在找到第一个不同的值时停止:

for i in A:
    if i not in B:
       indicator = True
       break

如果在一个非常长的200亿个值列表中,第一个项目已经不在B中,那么外部循环将只执行一次并退出,而不是200亿! 它不能保证你跑得更快 - 算法仍然是线性的,如果你可以提前停止取决于列表中的值 - 但运气好的话,你最终可能会节省大量的时间。

另请注意,i not in B实际上是复杂的线性。每次执行该行时,它都会隐式迭代B列表值。如果A包含N个元素而B包含M个元素,则在最坏情况下操作的总数将为N * M.对于非常小的M是可以的,但对于大的值列表,您可以考虑set。如果B是一个集合,则检查i not in B将在恒定时间内执行,因此操作总数将仅按N进行缩放。

如果您的问题有一个单行,如前面的答案所指出的,set是一系列独特的项目,因此使用它们可以获得具有线性复杂性的优雅单行。我的版本:

indicator = not(set(array) == set(allowed_values)) 

然而,生成集合需要读取所有输入数组,当你有一个非常大的数组并且你处于一个幸运的情况时,它可能比第一个解决方案慢:例如当第一个数字时数组不在您接受的值中。