Python - 比较列表

时间:2013-11-22 15:12:56

标签: python

我有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中的任何嵌套列表是否是骰子的子集。我正在寻找一个简单的真假回报。

感谢您的帮助。

3 个答案:

答案 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

您仍然可以将largeStraightsmallStraight中的每个列表转换为传递给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)

我希望它会对你有所帮助。