如何检查列表是否仅包含特定项

5

我有一个名为bag的列表。我想要检查其中是否只有一个特定项目。

bag = ["drink"]
if only "drink" in bag:
    print 'There is only a drink in the bag'
else:
    print 'There is something else other than a drink in the bag'

当然,在那段代码中放置“only”是错误的。有没有一个简单的替代方案?我已经尝试了几个类似的词。

如果len(bag) == 1并且item在bag中: - Haifeng Zhang
抱歉,我不是很清楚,您的意思是列表只有一个项目,即“饮料”,还是“饮料”只是列表中的一项?换句话说,["drink", "candy bar"] 是否符合您的 if 条件测试? - PTBNL
1
@Sнаđошƒаӽ 蒙特卡罗搜索关键字是不是你想要的功能,这不是编程的方式吗?你错过了很多。 - en_Knight
@en_Knight 抱歉,我不明白你的意思。 - Sнаđошƒаӽ
1
可能是重复问题。https://dev59.com/L3RC5IYBdhLWcg3wG9Xp,而Shadowfax只是一个玩笑(随机猜测单词直到有用的东西出现)。 - en_Knight
显示剩余2条评论
3个回答

15
使用内置的all()函数。
if bag and all(elem == "drink" for elem in bag):
    print("Only 'drink' is in the bag")

all()函数的定义如下:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True
出于这个原因,空列表将返回True。因为没有元素,它将完全跳过循环并返回True。因为这种情况,您必须添加一个明确的and len(bag)and bag来确保袋子不是空的(()[]是类似false的)。
此外,您可以使用一个set
if set(bag) == {['drink']}:
    print("Only 'drink' is in the bag")

或者,类似地:

if len(set(bag)) == 1 and 'drink' in bag:
    print("Only 'drink' is in the bag")

所有这些都适用于列表中的0个或多个元素。


1
第一个是唯一一个在袋子里还有其他东西时短路的(所有正确答案)。 - en_Knight
@zh_Knight 很好的发现。我用any!=替换了它,这样在空列表上不会失败 :) - Goodies
对于任何一个,如果你需要使用的话,就使用它,因为你现在所拥有的那个是当任何元素不等于“drink”时为真。 - reemer9997
嗯...实际上,在空列表上仍然会失败。我想唯一的方法是添加一个明确的 and len(bag) - Goodies
1
看起来不错 +1。我会把and语句放在前面(为了再次短路),但这并不重要。 - en_Knight
显示剩余2条评论

1
您可以直接使用只包含此项的列表进行相等性检查:
if bag == ["drink"]:
    print 'There is only a drink in the bag'
else:
    print 'There is something else other than a drink in the bag'

如果你想检查列表中是否包含任何一个大于零的相同项"drink",你可以计算它们的数量并将其与列表长度进行比较:

if bag.count("drink") == len(bag) > 0:
    print 'There are only drinks in the bag'
else:
    print 'There is something else other than a drink in the bag'

Sam的问题和Lafada一样 - ["drink","drink"]怎么样?这不算只有饮料吗? - en_Knight
不确定。问题描述不够清晰。但我也提供了另一种选择。 - Byte Commander
好的,第二个似乎几乎正确。只是为了严谨起见,它在空列表上失败了。 - en_Knight
["drink","drink"] 确实符合只有饮料的条件。我刚意识到问题表述不够清晰。第二个选项最适合。 - reemer9997
@en_Knight 我已经纠正了第二个例子,并添加了一个检查,要求长度必须大于零。现在空列表不再是一个错误的结果。 - Byte Commander
显示剩余2条评论

0

你可以检查列表的长度

if len(bag) == 1 and "drink" in bag:
    #do your operation.

似乎 ['drink', 'drink'] 应该被视为只包含一个 drink,但是在你的实现中却不是这样。 - en_Knight
1
是的,你说得对:),然后必须检查“所有”第二个答案:) - Nilesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接