随机替换列表中的项目

randomly replace item in list

我有两个列表 A =[2,3,4,5,33,42,21]B = [1,11,35,48,19] 我想随机删除列表 B 的两个项目并替换为列表 A 中的两个随机项目进行 200 次迭代.我使用了这段代码,但只有一项 B 替换为 A。我该怎么做?

import random

A = [2,3,4,5,33,42,21]
B = [1,11,35,48,19]

x = random.randrange(0,5)
i = A[x]
A[x] = B[x]
B[x] = i
print(A)
print(B)

你几乎成功了:

import random

A = [2,3,4,5,33,42,21]
B = [1,11,35,48,19]


for _ in range(400):
    x = random.randrange(0,5)
    A[x], B[x] = B[x], A[x]
print(A)
print(B)

您想循环 400 次,因为每次迭代要更改 2 个项目,并且要循环 200 次。你也可以这样做:

import random

A = [2,3,4,5,33,42,21]
B = [1,11,35,48,19]


for _ in range(200):
    x = random.randrange(0,5)
    y = random.randrange(0,5)
    while y == x:
        y = random.randrange(0,5)
    A[x], B[x] = B[x], A[x]
    A[y], B[y] = B[y], A[y]
print(A)
print(B)

这有一个“好处”,即 2 个替代品永远不会相同(您可能已经问过?)

使用random.sample.

import random

list_a = [2, 3, 4, 5, 33, 42, 21]
list_b = [1, 11, 35, 48, 19]

a_index1, a_index2 = random.sample(range(len(list_a)), k=2)
b_index1, b_index2 = random.sample(range(len(list_b)), k=2)
list_a[a_index1], list_b[b_index1] = list_b[b_index1], list_a[a_index1]
list_a[a_index2], list_b[b_index2] = list_b[b_index2], list_a[a_index2]

这里唯一需要补充的是放入一个循环,循环200次

random.sample 从可迭代对象中选择 k 个唯一选项,因此不会出现在迭代中两次选择相同整数的情况。

如果您尝试对 list_alist_b 使用相同的索引,您将永远不会替换 list_a 中的最后两个元素,因为 list_b 更短并且确实没有等效索引。

编辑:

关于扩展这个问题:

目前,索引被解包为 2 个变量。当您更改为 k=5 时,您正试图将 5 个值的 list 解包为 2 个变量。

正确的解决办法是让它动态化。

import random

def swap(list_a, list_b, indexes_to_swap=2):
    a_indexes = random.sample(range(len(list_a)), k=indexes_to_swap)
    b_indexes = random.sample(range(len(list_b)), k=indexes_to_swap)
    for a_index, b_index in zip(a_indexes, b_indexes):
        list_a[a_index], list_b[b_index] = list_b[b_index], list_a[a_index]

list_a = [3,4,15,18,21,35,36,45,47]
list_b = [0,1,2,5,6,7,8,9,10,11,12,13,14,16,17,19,20,22,23,24,25,26,27,28,29,30,31,32,33,34,37,38,39,40,41,42,43,44,46,48]
swap(list_a, list_b, 5)

如果你想做200次:

for _ in range(200):
    swap(list_a, list_b, 5)