2013-11-22 93 views
0

我有3名名單,其中第一個是由5個隨機數字的列表,如下圖所示:Python的 - 比較列表

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中的任何嵌套列表是否是骰子的子集。我正在尋找一個簡單的真實或虛假的回報。

感謝您的任何幫助。

+4

這裏命令很重要嗎?還是他們真的打算成爲集? –

+0

順序不重要,在rollDice上添加排序(dice)返回以避免這種情況。 – h1h1

+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

以下是可能的解決方案

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) 

我希望它會幫助你。

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 

和使用集建議在其他swers。

你也可以用一個列表理解替換當前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中是否有一對相同的數字,並且它是一個集合,那麼你總是會得到否定的迴應。

+0

是不是'骰子= {}'一個字典,而不是一套?另外,如果訂單很重要,您可以對其進行排序。我喜歡這個解決方案比使用套件更好。 – DaoWen

+0

@DaoWen我總是犯這個錯誤,編輯。 – rlms

+1

我剛剛意識到,如果您將結果打印給用戶,使用'rollDice'返回一個集合是有問題的,因爲它會吃掉任何重複的卷。 – DaoWen