我有3个列表,第一个是5个随机数字的列表,如下所示:
import random
def rollDice():
dice = []
for i in range(5):
dice.append(random.randint(1,6))
return sorted(dice)
dice = rollDice()
largeStraight = [[1,2,3,4,5] , [2,3,4,5,6]]
smallStraight = [[1,2,3,4] , [2,3,4,5] , [3,4,5,6]]
我的问题是什么是查看骰子是否等于largeStraight中任何一个嵌套列表的最佳方法,其次是smallStraight中的任何嵌套列表是否是骰子的子集。我正在寻找一个简单的真假回报。
感谢您的帮助。
答案 0 :(得分:4)
使用集合代替列表:
largeStraight = [{1, 2, 3, 4, 5}, {2, 3, 4, 5, 6}]
smallStraight = [{1, 2, 3, 4}, {2, 3, 4, 5} , {3 ,4, 5, 6}]
现在您可以使用设置操作:
if any(ls.issubset(dice) for ls in largeStraight):
# a large straight
elif any(ss.issubset(dice) for ss in smallStraight):
# a small straight
您仍然可以将largeStraight
和smallStraight
中的每个列表转换为传递给any()
的生成器表达式中的一个集合,但这会浪费CPU周期。
演示:
>>> dice = [2, 3, 5, 1, 4]
>>> if any(ls.issubset(dice) for ls in largeStraight):
... print 'Large!'
... elif any(ss.issubset(dice) for ss in smallStraight):
... print 'Small!'
...
Large!
>>> dice = [2, 3, 5, 1, 6]
>>> if any(ls.issubset(dice) for ls in largeStraight):
... print 'Large!'
... elif any(ss.issubset(dice) for ss in smallStraight):
... print 'Small!'
...
>>> dice = [2, 3, 6, 4, 1]
>>> if any(ls.issubset(dice) for ls in largeStraight):
... print 'Large!'
... elif any(ss.issubset(dice) for ss in smallStraight):
... print 'Small!'
...
Small!
答案 1 :(得分:3)
如果订单很重要,对于大直道,您可以这样做:
dice in largeStraight
对于小直道,你可以这样做:
any(i in (dice[0:4], dice[1:5]) for i in smallStraight)
或者,您可以将rollDice
函数替换为:
def rollDice():
dice = set()
for i in range(5):
dice.add(random.randint(1, 6))
return dice
并使用其他答案中建议的集合。
您还可以使用列表解析替换当前的rollDice
定义:
def rollDice():
return sorted([random.randint(1, 6) for _ in range(5)])
或
def rollDice():
return {random.randint(1, 6) for _ in range(5)}
一套。
但是,我建议不要使用套装。它可以在这种情况下工作,但我认为这是一个更大的程序的一部分。集合不能有重复的元素,所以如果你以后想要检查dice
中是否有一对相等的数字,并且它是一个集合,那么你总会得到否定的答案。
答案 2 :(得分:1)
这是可能的解决方案
is_large_straight = any(set(x) & set(dice) == set(x) for x in largeStraight)
is_small_straight = any(set(x) & set(dice) == set(x) for x in smallStraight)
我希望它会对你有所帮助。