如何在python中查找列表是否包含多个相同元素?
所以我刚开始学习python,我每周都从我的朋友那里得到一些小的课程。本周将制作一个简单的老虎机游戏。老虎机中有6个项目,当3个或更多相同项目出现时,用户获胜。我尝试了以下代码:如何在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的一部分时,该代码起作用,但如果列表中的三个元素都不是第一项,则该代码不起作用,如下所示
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))
也许?