【问题标题】:Add +1 to Count=0 if element in list has at least one 1 value. Python如果列表中的元素至少有一个 1 值,则将 +1 添加到 Count=0。 Python
【发布时间】:2013-02-14 22:08:59
【问题描述】:
count_element_has_1 = 0
count_all_0 = 0   

my_list = [[0,0,1],[1,1,0,1],[0,0,0,0]]

我想检查列表中的每个元素是否至少有 1,然后将 +1 添加到 count_element_has_1,如果它们都为 0,则将 +1 添加到 count_all_0

所以在这种情况下它看起来像

count_element_has_1 = 2
count_all_0 = 1

【问题讨论】:

  • 我知道的唯一方法是为每个值 1 添加它,这不是我想要的

标签: python list count add


【解决方案1】:
for lst in my_list:
    if 1 in lst:
       count_element_has_1 += 1
    elif lst.count(0) == len(lst):
       count_all_0 += 1

根据列表,第二个条件可能会更好:

elif all(x==0 for x in lst):
    count_all_0 += 1

因为这允许短路。

【讨论】:

  • +1,或者,在可怕的单行模式下:count_element_has_1, count_all_0 = map(sum, zip(*((1 in l, all(i == 0 for i in l)) for l in my_list)))
  • @Lattyware -- 我不确定是要留下深刻的印象,还是把我的笔记本电脑扔给你......
【解决方案2】:

您可以使用sum 函数,结合列表推导。

如果列表可以包含 其他 数字而不是 01,试试这个:

count_has_1 = sum(1 for element in my_list if 1 in element)
count_all_0 = sum(1 for element in my_list if all(e == 0 for e in element))

如果您确定知道列表只包含01,您也可以这样做:

count_has_1 = sum(map(any, my_list))
count_all_0 = len(my_list) - count_has_1

第一行是利用 Python 将 10 解释为 TrueFalse 的事实,反之亦然,首先将每个子列表映射到是否有任何值为真,例如[0,1,0] -> True,然后总结得到的布尔值列表,例如[True, False, True] -> 2.

【讨论】:

  • 请注意,这确实意味着多个循环,这在性能方面并不那么好。
  • @tobias_k count_has_1 = sum(1 in element for element in my_list) 工作
  • @eyquem 啊,对。将整数解释为布尔值,将布尔值解释为整数的魔力……这个怎么样? count_has_1 = sum(map(any, my_list))(假设所有数字都是 10)。
  • @tobias_k 我认为这很完美。非零元素甚至不必只有数字 1。我认为你应该只用 count_has_1 = sum(map(any, my_list))count_all_0 = len(my_list) - count_has_1 重写你的答案,然后我会投票赞成并要求 @dracontheOry 接受它!
  • @eyquem 已编辑。不过,我们应该保留除 0 和 1 以外的其他数字的情况,否则像 [0,2,3] 这样的列表也会被计入 count_has_1
【解决方案3】:

你可以使用collections.Counter()O(N^2) 复杂度:

In [22]: lis=[[0,0,1],[1,1,0,1],[0,0,0,0]]

In [23]: from collections import Counter

In [24]: count_element_has_1 = 0

In [25]: count_all_0 = 0

In [26]: for x in lis:
    c=Counter(x)
    if c[0]==len(x):
        count_all_0 +=1
    elif c[1]>0:    
        count_element_has_1 +=1
   ....:         

In [27]: count_element_has_1
Out[27]: 2

In [28]: count_all_0
Out[28]: 1

【讨论】:

    【解决方案4】:
    my_list = [[0,0,1],[1,1,0,1],[0,0,0,0],[4,0,88]]
    #
    count_has_1 = sum(1 in sub for sub in my_list)
    print count_has_1 # prints 2
    #
    count_all_0 = sum(not any(sub) for sub in my_list)
    print count_all_0 # prints 1
    

    .

    如果子列表中只有 0 和 1,那么统计这两个类别是没有用的:

    my_list = [[0,0,1],[1,1,0,1],[0,0,0,0]]
    #
    count_has_non0 = sum(map(any,my_list))
    print count_has_non0 # prints 2
    #
    print len(my_list) - count_has_1  # prints 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 2016-04-07
      相关资源
      最近更新 更多