如何随机替换列表元素为另一个列表的元素?

5
x_list = ['a', 'b', 'c', 'd', 'e']
t_list = ['z', 'y', 'u']

我想用x_list的元素随机替换t_list的元素。我进行了一些研究并尝试了一些方法,但是对于列表来说,replace()无法正常工作。例如:x_new0 = ['a', 'z', 'c', 'y', 'u]x_new1 = ['z', 'y', 'c', 'd','u']。我该如何做到这一点?


你可以直接赋值元素,例如 x_list[2] = t_list[0] - nos
重要的是a) 新列表中包含t_list的所有元素,以及b) 这些元素按顺序排列吗? - David Robinson
你能展示一下你的尝试吗?你都尝试了什么?哪些方法没有奏效?你能提供一个最小可复现代码来描述你的问题吗? - Christian Dean
1
这是按位置还是按值传递?如果在 x_list 中有另一个 a 并被替换为 z,那么所有的值都会被替换为 z 吗?如果两个列表的长度相同,直接替换是正确的答案吗?如果 x 中的元素比 t 少怎么办... t 的元素是否必须按顺序出现在 x 中...等等? - Jon Clements
3个回答

4
您可以使用random模块并使用random.randint()方法生成介于1和100之间的随机数作为正反面硬币投掷来决定是否替换值,然后在第二个列表上使用random.choice()方法返回列表的一个随机元素。
import random

first = ['a', 'b', 'c', 'd', 'e']
second = ['z', 'y', 'u']

print(first)

for index, x in enumerate(first):
    if random.randint(0, 1):
        first[index] = random.choice(second)

print(first)

First run stdout:
>> ['a', 'b', 'c', 'd', 'e']
>> ['y', 'z', 'u', 'y', 'y']

Second run stdout:
>> ['a', 'b', 'c', 'd', 'e']
>> ['a', 'u', 'c', 'u', 'y']

1
它正在替换第一个列表的所有元素,也许他不想要那样做 @AK47 - Sanket
只有在“正反面”每次返回true时,它才会替换所有元素。 - AK47
他从未指定不想要重复项,允许重复意味着解决方案更加“随机”,因为有更多的可能结果。 - AK47
而且由于他的第二个列表比第一个列表小 - AK47
使用 random.choice([0, 1]) (或 True/False) 而非 random.randint(0,100)>50 的任何理由吗? - Jon Clements
显示剩余2条评论

2

您可以使用numpy.random.choice来随机选择元素,以指定原始列表中要进行替换的位置。然后将这些索引与想要用于替换的值一起压缩,并应用替换。

from numpy.random import choice

def swap_elements(x, t):
    new_x = x[:]
    for idx, value in zip(choice(range(len(x)), size=len(t), replace=False), t_list):
        new_x[idx] = value
    return new_x

示例用法

>>> x_list = ['a', 'b', 'c', 'd', 'e']
>>> t_list = ['z', 'y', 'u']
>>> swap_elements(x_list, t_list)
['y', 'u', 'z', 'd', 'e']
>>> swap_elements(x_list, t_list)
['y', 'b', 'z', 'u', 'e']
>>> swap_elements(x_list, t_list)
['y', 'b', 'z', 'u', 'e']
>>> swap_elements(x_list, t_list)
['a', 'u', 'z', 'y', 'e']

swap_elements(x,t)中的t_list应该只是t吗?还是必须传递原始的t_list? - ashley

0
你可以选择一个列表中的随机索引,以及另一个列表中的随机索引,并将其中一个列表中索引位置的值放到另一个列表中对应的索引位置。例如:
from random import randint

a = [1 ,2, 3, 4]
b = [5, 6, 7, 8]

RandomIndexA = randint(0, len(a) - 1)
RandomIndexB = randint(0, len(b) - 1)

a[RandomIndexA] = b[RandomIndexB]

或者,您可以仅计算一个随机索引,然后使用random.choice(b)从另一个列表中随机选择一个元素,例如:

from random import randint, choice

a = [1 ,2, 3, 4]
b = [5, 6, 7, 8]

RandomIndex = randint(0, len(a) - 1)

a[RandomIndex] = choice(b)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接