我正在尝试确定列表 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());
是否包含与其他两个值不同的值,这些值构成列表A
(B
和0
):< / 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
答案 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))
然而,生成集合需要读取所有输入数组,当你有一个非常大的数组并且你处于一个幸运的情况时,它可能比第一个解决方案慢:例如当第一个数字时数组不在您接受的值中。