如何在python中查找列表是否包含多个相同元素?

如何在python中查找列表是否包含多个相同元素?,python,python-3.x,Python,Python 3.x,所以我刚开始学习python,我每周都从我的朋友那里得到一些小的课程。本周将制作一个简单的老虎机游戏。老虎机中有6个项目,当3个或更多相同项目出现时,用户获胜。我尝试了以下代码: for i in slotScreen: if slotScreen.count(i) == 3: print('You got 3 of the same! You win!') 当列表中的第一项是某类3的一部分时,该代码起作用,但如果列表中的三个元素都不是第一项,则该代码不起作用,如下所示

所以我刚开始学习python,我每周都从我的朋友那里得到一些小的课程。本周将制作一个简单的老虎机游戏。老虎机中有6个项目,当3个或更多相同项目出现时,用户获胜。我尝试了以下代码:

for i in slotScreen:
    if slotScreen.count(i) == 3:
        print('You got 3 of the same! You win!')
当列表中的第一项是某类3的一部分时,该代码起作用,但如果列表中的三个元素都不是第一项,则该代码不起作用,如下所示:

slotScreen = ['lemon', 'cherry', 'lemon', 'lemon', 'pirate', 'bar']  # works

slotScreen = ['cherry', 'lemon', 'lemon', 'lemon', 'pirate', 'bar']  # not work
知道为什么会这样吗

编辑:更多代码。当我应该收到You win 3x消息时,我收到You Lose消息

        for i in slotScreen:
            if slotScreen.count(i) == 6:
                print('You win 10x your bet!!!')
                x = x + int(bet) * 10
                break

            elif slotScreen.count(i) == 5:
                print('You win 5x your bet!')
                x = x + int(bet) * 5
                break

            elif slotScreen.count(i) == 4:
                print('You win 4x your bet!')
                x = x + int(bet) * 4
                break

            elif slotScreen.count(i) == 3:
                print('You win 3x your bet!')
                x = x + int(bet) * 3
                break

            elif slotScreen.count(i) <= 2:
                print('Sorry you lose')
                break
slotScreen中的i的
:
如果slotScreen.count(i)=6:
打印(“你赢了10倍的赌注!!!”)
x=x+int(下注)*10
打破
elif slotScreen.count(i)==5:
打印(“您赢了5倍的赌注!”)
x=x+int(下注)*5
打破
elif slotScreen.count(i)==4:
打印(“您赢了4倍的赌注!”)
x=x+int(下注)*4
打破
elif slotScreen.count(i)==3:
打印(“您赢了3倍的赌注!”)
x=x+int(下注)*3
打破

elif slotScreen.count(i)您的代码对我有效:

您的程序总是在第一次迭代中
中断
,因此它只计算列表的第一个元素。

Marco de Wit的回答是正确的。我想我会提供一个可能的解决方案

from collections import Counter

counter = Counter(['cherry', 'lemon', 'lemon', 'lemon', 'pirate', 'bar'])
symbol, count = counter.most_common(1)[0]

这将为您提供列表中最常见符号的符号(在本例中为“lemon”)及其计数(在本例中为3)(如果您想处理领带,则需要扩展此符号)。

您可以尝试转换为一组,然后进行比较

def contains_multiple(iterable):
    return len(a) != len(set(a) )

a = [1, 1]
b = [1, 2]

contains_multiple(a) # true
contains_multiple(b) # False
为避免列表包含某些不可损坏的项时出错,应通过以下方法解决此问题:

def unique(iterable):
    try:
        unique_items = set(iterable)
    except:
        unique_items = []
        for item in iterable:
            if item not in unique_items:
                unique_items.append(item)

    return unique_items

def contains_multiple(iterable):
    return len(iterable) != len(unique(iterable) )

使用听写理解制作直方图,然后进行检查

>>> L = ['cherry', 'lemon', 'lemon', 'bar', 'bar', 'bar']
>>> d = {f: L.count(f) for f in set(L)}
>>> for fruit in d:
        if d[fruit] > 2:
            print("You got {} {}'s! You win!").format(d[fruit], fruit)

You got 3 bar's! You win!
这段代码现在看起来可能很神秘,但一旦您学会阅读和理解列表和字典的理解,它们就更容易使用,也不容易出错

这是创建的字典,然后命名为d。它将每个水果作为一个键,其中包含一个值的计数:

>>> {f: L.count(f) for f in set(L)}
{'cherry': 1, 'lemon': 2, 'bar': 3}

python中的for循环可用于循环字典的键,就像列表或任何其他iterable中的项一样简单。然后,您可以使用每个键访问计数值并对其进行测试。

虽然我认为其他一些答案给出了一种替代实现,但我认为,看看如何修复当前算法可能会很有用:

    for i in slotScreen:
        if slotScreen.count(i) == 6:
            print('You win 10x your bet!!!')
            x = x + int(bet) * 10
            break

        elif slotScreen.count(i) == 5:
            print('You win 5x your bet!')
            x = x + int(bet) * 5
            break

        elif slotScreen.count(i) == 4:
            print('You win 4x your bet!')
            x = x + int(bet) * 4
            break

        elif slotScreen.count(i) == 3:
            print('You win 3x your bet!')
            x = x + int(bet) * 3
            break

        # no else clause on the if statement, because we can't tell if you've lost yet

    else:  # this else block is attached to the for, and runs if no break was hit
        print('Sorry you lose')
这使用了有点模糊的
else
子句,您可以将它放在
for
循环之后。只有循环运行到完成时,
else
块才会运行,而不是通过
break
语句提前退出。这意味着“youlose”代码只有在检查完列表中的所有值后才会出现。请注意,您实际上可以更早地停止,因为如果您检查了六个长列表中的前四个值,则在最后两个值中找不到任何三种类型的值


您还可以做一些其他的小改进,例如在循环中每个周期只运行一次
slotScreen.count(i)
,并将其保存到一个变量中,该变量可以由每个
if
/
elif
测试进行测试。

您的代码看起来很正确。但是,做
elem,count=Counter(slotScreen)会“更快”(
O(n)
而不是
O(n^2)
);如果count>3:print(“Got{}{}times.format(elem,count))
@Dougal post作为解决方案,这样我就可以向上投票感谢提示!但是就像我说的,我才刚刚开始,所以我想先尝试学习一些基本的东西。也许只是我是新来的,但代码看起来更难理解:/嗯,这很奇怪。我又试了一次,发现它有时有效,有时无效。我也有条件,如果有6种,5种,等等,我把代码放在第一篇文章。它给了我“对不起,你丢了”的信息,大约有一半的时间它应该给我“你赢了3倍”的信息。正如马可所指出的,这是因为你没有发布足够的代码<代码>设置
s是无序的,因此这无法持续工作。在我的系统上(也可能是你的系统,以你的例子来说),将
[2,1]
传递给你的函数将得到
True
返回(但我使用的是Python3,其中散列随机化使得即使在同一系统上运行,也可能不一致)。你的意思是使用
len(a)!=len(set(a))
也许?