2017-08-11 61 views
1

我嘗試在列表中隨機選擇一個項目或不選擇任何項目。我如何使random.choice包含不選擇?

例如,我想選擇「a」,「b」或空白(均不是)。 有沒有辦法做到這一點?

或者我應該只是讓random.choice('a','b','')和彈出('')出?

import random 

foo = ['a', 'b'] 
print(random.choice(foo)) 

在此先感謝。

+0

你好,也許它可以幫助你https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.choice.html –

回答

1

如果你想你的列表傳遞給函數random.choice沒有通過添加空白選擇改變它,之後將其刪除,你可以用這樣的方式:

import random 

foo = ['a','b'] 

print(random.choice(foo+[''])) 

print(foo) # >>> ['a','b'] 
1

有很多的方式來做這個。您建議的方式(創建一個新列表,包含上一個列表中的所有項目,加上一個代表None的項目,並在新列表中使用random.choice)是一種有效的方法。

這樣一來,對於清單['a', 'b'],您將獲得:

  • 1/3概率變得越來越得到'''b'
  • 1/3的概率'a'
  • 1/3的概率(無選擇)。

我寧願用Python的None來表示沒有價值。

my_options = ['a', 'b'] 
selection = random.choice(my_options + [None]) 

另外,如果說你想的None的概率是一些p值,然後將所有接收(1-p)的n個選擇/ N的概率被拾起,你可以寫像這樣:

my_options = ['a', 'b'] 
pnone = 0.5 
if random.random() < pnone: 
    selection = None 
else: 
    selection = random.choice(my_options) 

如果你不太在意概率,我會選擇第一種方法(這是你的建議)。

+0

非常感謝我回答我的問題! 如果選擇了[無],那麼[無]仍然有它的位置,對吧? 我的意思是,實際上我想插入包括none的項目到其他列表中。 在這種情況下,我試圖編寫這樣的代碼。 富= [ '一', 'B'] 選擇= random.choice(FOO + [無]) 右= [ '一', 'B'] right.insert(1,選擇) 打印正確 然後,其中一個結果是['a',None,'b'] 這裏,right [1] = None,而不是'b',對嗎? –

+0

是的,在這種情況下,「right [1]」將是「None」。 – Odysseas

+0

@HyunkyungKoo當你調用'right.insert(1,choice)'時,'choice'的值被插入'right'裏面的索引1,'a'之後,'b'之前。無論「選擇」具有什麼價值,都會發生這種情況。因此,最後'right'的3個可能結果是'['a','a','b']','['a',b','b']'和'['a',無, 'b']'。所有三個列表的長度都是3。在Python中,列表可以保存不同類型的值,包括None值。 – Odysseas