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

Posted

技术标签:

【中文标题】如何用另一个列表元素随机替换列表元素?【英文标题】:How to randomly replace elements of list with another list elements? 【发布时间】:2018-02-19 19:35:58 【问题描述】:
x_list = ['a', 'b', 'c', 'd', 'e']
t_list = ['z', 'y', 'u']

我想将t_list 的元素替换为x_list 的元素,“随机”。我研究并尝试了一些东西,但replace() 不适用于列表。例如; x_new0 = ['a', 'z', 'c', 'y', 'u]x_new1 = ['z', 'y', 'c', 'd','u']。我该怎么做?

【问题讨论】:

您可以直接分配元素,例如x_list[2] = t_list[0] a) t_list 的所有元素都包含在新列表中,并且 b) 这些元素是否按顺序排列是否重要? 你能展示你的尝试吗?有什么尝试?什么没用?你能提供一个minimal reproducible example你的问题吗? 这是按位置还是按价值?如果您在 x_list 中有另一个 a 并且它被替换为 z - 所有值都会被 z 替换吗?如果两个列表的长度相同 - 是直接替换正确答案。如果x 中的元素比t 少怎么办... t 的元素是否必须按顺序出现在x... 等等...? 【参考方案1】:

您可以使用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']

【讨论】:

它替换了第一个列表的所有元素,他可能不想要那个@AK47 只有在 'heads and tails' 每次都返回 true 时才会替换所有元素 这允许重复替换 他从来没有指定他不想要重复,并且允许重复意味着解决方案更加“随机”,因为有更多可能的结果 而且由于他的第二个列表小于第一个列表【参考方案2】:

您可以使用numpy.random.choice 随机选择您希望在原始列表中发生替换的元素。然后zip 这些索引针对您要用于替换的值并应用替换。

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?【参考方案3】:

您可以选择一个列表的随机索引,以及另一个列表的随机索引,并在一个列表的索引处取值并将其放在另一个列表的索引处。例如:

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)

【讨论】:

以上是关于如何用另一个列表元素随机替换列表元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何用随机数组元素替换文本?

根据另一个列表元素获取一些列表元素索引

根据名称将列表元素替换为另一个列表元素

如何用另一个arraylist的内容替换arraylist的内容?

如何根据有序列表替换pandas dataframe列中的元素?

如何用包含空格的字符串替换列表中的项目?