【问题标题】:Using counter as condition使用计数器作为条件
【发布时间】:2021-09-02 04:56:55
【问题描述】:

我正在尝试根据变量的出现次数来做一个条件。 如果任何变量出现不止一次,如果每个变量出现一次,它只会显示为正确,则它会显示为错误。我试过了,但没有用:

from collections import Counter
z = ['blue', 'red', 'yellow']
Counter(z)
print(Counter(z))

if Counter(z).items() != 1:
    print('Wrong')
else:
    print('Right')

【问题讨论】:

  • 1) 每次调用 Counter(z) 时,都会创建一个新的 Counter 对象。 2) .items() 没有做你认为的事情(查找 Counter 和 python dicts 的文档)

标签: python collections counter


【解决方案1】:

只需使用all 来检查单次出现条件。 如果 value 为 1,那么它会将 True 附加到列表中,否则 False

all 检查列表中的所有元素是否都是True

from collections import Counter
z = ['blue', 'red', 'red','yellow']
dic = Counter(z)

if all(value == 1 for key, value in dic.items()):
    print('Right')
else:
    print('Wrong')

【讨论】:

  • 没有列表,也没有附加任何内容。 all 不创建列表,它只是迭代它接收到的可迭代对象(在本例中为生成器)并在谓词第一次为 False 时短路
  • 请举个例子,当谓词第一次是False
  • @DeepSpace ,是的,你是对的,我的错,这将是一个可迭代的而不是一个列表。
【解决方案2】:

实现这一点的最简单方法是使用all 而不是counter.values()(包含所有计数):

from collections import Counter

right_counter = Counter([1, 2])

if all(count == 1 for count in right_counter.values()):
    print('right')
else:
    print('wrong')

wrong_counter = Counter([1, 1, 2])

if all(count == 1 for count in wrong_counter.values()):
    print('right')
else:
    print('wrong')

输出

right
wrong

或者,您可以确保列表的长度等于列表集合的长度:

right_list = [1, 2]
wrong_list = [1, 1, 2]

if len(right_list) == len(set(right_list)):
    print('right')
else:
    print('wrong')

if len(wrong_list) == len(set(wrong_list)):
    print('right')
else:
    print('wrong')

也输出

right
wrong

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多