有效计算真假的方法

Chr*_*isG 6 python algorithm counting python-2.7

这可能是一个微不足道的问题,但我想更多地了解其他更聪明有效的解决方法.

我有一个项目列表,每个项目都有一个a值为二进制的属性.

  • 如果列表中的每个项目都有a == 0,那么我设置一个单独的变量b = 0.
  • 如果列表中的每个项目都有a == 1,那么我就设置了b = 1.
  • 如果存在的混合物a == 0,并a == 1在列表中,然后我设置 b = 2.

我可以使用一个集合来跟踪a值的类型,这样如果在遍历列表后集合中有两个项目,那么我可以设置b = 2,而如果集合中只有一个项目我只是检索项目(0或1)并使用它来设置b.

有更好的方法吗?

Tim*_*ers 26

一次通过列表,没有构建额外的数据结构:

def zot(bs):
    n, s = len(bs), sum(bs)
    return 1 if n == s else 2 if s else 0
Run Code Online (Sandbox Code Playgroud)

  • 啊,但*下次*你看到这样的问题的时候,它会发生在你身上.相差几十年,你的技巧变得越来越大;-) (10认同)

sen*_*rle 18

我建议使用anyall.我想说这样做的好处是可读性而不是聪明或效率.例如:

>>> vals0 = [0, 0, 0, 0, 0]
>>> vals1 = [1, 1, 1, 1, 1]
>>> vals2 = [0, 1, 0, 1, 0]
>>> def category(vals):
...     if all(vals):
...         return 1
...     elif any(vals):
...         return 2
...     else:
...         return 0
... 
>>> category(vals0)
0
>>> category(vals1)
1
>>> category(vals2)
2
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以缩短一点:

>>> def category(vals):
...     return 1 if all(vals) else 2 if any(vals) else 0
... 
Run Code Online (Sandbox Code Playgroud)

这适用于任何可以解释__nonzero__(或者__bool__在Python 3)为具有true或false值.


ber*_*roe 15

有人提到代码高尔夫,所以无法抗拒@ senderle的变种:

[0,2,1][all(vals) + any(vals)]
Run Code Online (Sandbox Code Playgroud)

简短说明:这使用布尔值作为它们的整数等价物来索引所需响应的列表.如果all是真的那么any也必须是真的,所以他们的总和是2.any单独给出1,没有匹配给出0.这些索引从列表中返回相应的值.

如果原来的要求,可以修改为使用1any2all它会更简单,只是返回的整数any + all