2017-07-18 33 views
0

我想隨意更換名單的20%,在python:的Python:更換名單的20%

ls = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
ls = [1, 2, NULL, 4, 5, 6, NULL, 8, 9, 10] 
ls = [1, 2, 82, 4, 5, 6, 28, 8, 9, 10] 

到目前爲止

while n <= len(ls)/5 
    ls[randint(0, 9)]=randint(1, 100) 
    n += 1 

,但它具有去除的一個相當大的機會並在一次運行中多次替換相同的條目。

+1

您是否想完全替換列表內容的20%,或者是否要以20%的概率獨立替換每個元素(以便平均取代列表中20%的元素)? –

+0

我需要正好替換每個運行的內容的20%。 – Mark

回答

5

假設ls可能是任何東西,我會建議生成一個索引列表,對應於ls。然後,您可以使用random.sample來提取這些指數的20%,然後僅更改這些指數。

從文檔:

返回從羣體 序列選擇獨特元件的第k長度列表。用於無需更換的隨機抽樣。

In [816]: for _i in random.sample(range(len(ls)), len(ls) // 5): 
    ...:  ls[_i] = random.randint(1, 100) 
    ...:  

In [817]: ls 
Out[817]: [1, 92, 3, 4, 5, 6, 7, 8, 75, 10] 
+0

您不必將範圍轉換爲列表。 – skrx

+0

@skrx謝謝你。 –

1

除非你的列表是非常大的,你可以選擇從指數樣本。例如:

for idx in random.sample(range(len(ls)), len(ls)/5): 
    ls[idx]=random.randint(1, 100) 
+2

在3.x中失敗,因爲k必須作爲整數給出,但3.x中的除法轉換爲浮點數。 –

+0

只需將'len(ls)/ 5'改爲'len(ls)// 5'即可使其與Python 3兼容。 – skrx

+0

或'int(len(ls)/ 5)',或者有效。 – viraptor

1

可以shuffle一系列指標,然後採取第一n指標有改變。

from random import shuffle 
x = [[i] for i in range(10)] 
shuffle(x) 

#change x[0], x[1], .. x[n-1] 
1

如果你想消除同一指數的機會越來越更換第二次,你可以的randint(0, 9)結果存儲在一個變量。在下一次迭代中,使用if條件來檢查randint()是否返回與上一次迭代相同的索引。如果是,則繼續並且不增加n

或者,您可以使用random.sample()來挑選給定數量的樣本 - 在您的案例中爲列表大小的20%。

0

最好的選擇是挑選20%的索引,然後在列表中替換它們。喜歡的東西:

from random import randint 
twenty_percent = round(len(ls)/5) 
for i in range(twenty_percent): 
    ls[randint(0, len(ls) - 1)] = randint(1, 100) 
0

這個答案需要INDEX考慮進去,所以它不會取代兩次相同的值。

ls = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] 
n = len(ls) 

x = round(n/5) 

for i in range(x): 
    index = randint(0, n) 
    del ls[index] 
    ls.insert(index, randint(0, 100)) 

print(ls) 

適合我。看看它是否完成這項工作。