2011-12-20 50 views
1

我想提出創建極大列表的最簡單方法。構建一個變量,將龐大列表中的若干枚舉組合在一起

比方說,我有三個六面骰子,所以他們將分別具有值randint(1,6)。 我想要一套包含所有可能的方法來組合這3個數字的值,所以它可能是die1 * die2 + die3或者它可能是die1 ** die3 - die2等。

我想定義一些變量Z等於加法,減法,乘法等。這樣,我可以說die1 Z die2 Z die3,它會給我一個巨大的列表,而不必輸入它。這在Python中可能嗎?任何想法將不勝感激。

+2

表達自己更清楚。你想實現什麼?變量如何等於幾個操作?這實際上意味着什麼? – Marcin 2011-12-20 01:39:59

+0

我想我需要類似列表理解的東西,我只是不知道如何使用操作而不是數字來完成它。 – ritchie3237 2011-12-20 01:41:06

回答

2

知道這裏的關鍵是,你可以將一個函數作爲參數傳遞給另一個函數(或列表)。一旦你明白這個問題變得更容易解決。

如果你想有一個列表理解:

from operator import add,sub,mul,div 
funcs = [add,sub,mul,div] 
die = [1,2,3,4,5,6] 

results = [f(x,y) if y != 0 else None for x in die for y in [g(z,w) for z in die for w in die for g in funcs] for f in funcs] 

注意,包含「無」,其中一個被零除將有常發生。

如果你把它分成一個函數,它會更清晰。它需要兩個數字列表和一個操作列表,並返回所有結果:

def results(funcs, xs, ys): 
    out = [] 
    for f in funcs: 
    for x in xs: 
     for y in ys: 
     try: 
      out.append(f(x,y)) 
     except ZeroDivisionError: 
      pass 
    return out 

這沒有什麼地方會發生零除。使用像results(funcs,die,results(funcs,die,die))來獲得所有結果。

這兩個都有很多重複的結果,所以根據你實際想要做的事情你可能需要一個set而不是list

而且,只是想到這一點,但是這取決於你打算做什麼,你可以得到results返回,而不是一臺發電機:

def results(funcs, xs, ys): 
    for f in funcs: 
    for x in xs: 
     for y in ys: 
     try: 
      yield f(x,y) 
     except ZeroDivisionError: 
      pass 

如果你的工作真正大的結果集,但只有想要一個接一個地看看它們,這比建立整個列表更好。

+1

['operator'](http://docs.python.org/library/operator.html)標準模塊在這裏很有用,而不是重新定義自己的操作。 – 2011-12-20 02:29:41

+0

好的。我不知道那是存在的。我會修復它,然後! – mange 2011-12-20 02:35:20

+0

這非常有幫助,謝謝。重複是沒有問題的 - 我正在做一個遊戲,只是爲了讓你更好地瞭解我所得到的結果,我會解釋它。你有一個目標數字,可以說它的100,你試圖用3個骰子。如果你的3個骰子的價值是1,1,1,你永遠不可能得到100的目標。所以我想生成一個你可能得到的每個可能數字的列表,然後比較玩家給出的答案。因此,如果誰玩的遊戲儘管無法獲得,但遊戲會告訴他們這是不可能的。 – ritchie3237 2011-12-20 02:39:59

0

我想你想問如何在python中最好的重載笛卡爾乘積的運算符。

嘗試使用productitertools

from itertools import * 
die_outcomes = [1,2,3,4,5,6] 
list(product(product(die_outcomes, die_outcomes), die_outcomes)) 
相關問題