2017-07-18 31 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) 

适合我。看看它是否完成这项工作。