python - 如何随机替换嵌套列表中的特定元素?

标签 python list random replace element

我有一个列表列表。如何创建一个随机将 10 的实例替换为另一个数字的函数?

lst = [ [10, 100, 10 ], [10, 1000, 10], [100, 100000, 100], [10, 10, 0] ]

这是我的代码。我只能设法得到一个扁平列表而不是嵌套列表。如何获取嵌套列表,有没有更有效的方法?

import random

def random_replace10(num, lst): # replaces 10 with num
    indexes = []
    flattened = [num for row in lst for num in row]
    for ind, ele in enumerate(flattened):
        if ele == 10:
            indexes.append(ind)

    random_index = random.sample(indexes, 1)[0]
    flattened[random_index] = num
    return flattened           #Returns a flattened list instead of a nested list.


print(random_replace10(2, lst))

>>> [ [10, 100, 2 ], [10, 1000, 10], [100, 100000, 100], [10, 10, 0] ]

print(random_replace10(91, lst))

>>> [ [10, 100, 2 ], [10, 1000, 10], [100, 100000, 100], [91, 10, 0] ]

最佳答案

您首先需要找到您有多少个 10 值,然后选择用 random.randrange() 选项替换哪个值。我使用 itertools.count() 来保持运行计数器以匹配所选实例:

from itertools import count
import random


def random_replace10(num, lst):
    selected = random.randrange(sum(sum(1 for i in sub if i == 10) for sub in lst))
    counter = count()
    return [
        [num if i == 10 and next(counter) == selected else i for i in sub] 
        for sub in lst
    ]

这会将一个 10 值替换为 num,不多也不少,并创建一个列表。旧列表保持不变。

您也可以就地进行替换,但在那种情况下我会返回 None(就像 list 上的其他变异方法一样,例如 list.append() 等)。在这种情况下,首先记录 10 值的位置,使用 random.choice() 从这些位置中选择一个:

import random

def random_replace10_inplace(num, lst):
    locations = [(i, j) for i, sub in enumerate(lst) for j, v in enumerate(sub) if v == 10]
    outer, inner = random.choice(locations)
    lst[outer][inner] = num

第一个版本的演示:

>>> lst = [[10, 100, 10], [10, 1000, 10], [100, 100000, 100], [10, 10, 0]]
>>> random_replace10(2, lst)
[[10, 100, 10], [10, 1000, 2], [100, 100000, 100], [10, 10, 0]]
>>> random_replace10(2, lst)
[[10, 100, 10], [10, 1000, 10], [100, 100000, 100], [10, 2, 0]]
>>> random_replace10(91, lst)
[[10, 100, 91], [10, 1000, 10], [100, 100000, 100], [10, 10, 0]]
>>> random_replace10(91, lst)
[[10, 100, 10], [10, 1000, 91], [100, 100000, 100], [10, 10, 0]]

和就地版本:

>>> lst = [[10, 100, 10], [10, 1000, 10], [100, 100000, 100], [10, 10, 0]]
>>> random_replace10_inplace(2, lst)
>>> lst
[[10, 100, 10], [10, 1000, 2], [100, 100000, 100], [10, 10, 0]]
>>> random_replace10_inplace(2, lst)
>>> lst
[[10, 100, 10], [2, 1000, 2], [100, 100000, 100], [10, 10, 0]]
>>> random_replace10_inplace(91, lst)
>>> lst
[[10, 100, 10], [2, 1000, 2], [100, 100000, 100], [91, 10, 0]]
>>> random_replace10_inplace(91, lst)
>>> lst
[[91, 100, 10], [2, 1000, 2], [100, 100000, 100], [91, 10, 0]]

关于python - 如何随机替换嵌套列表中的特定元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52915159/

相关文章:

list - takeWhile 测试嵌套列表的长度

list - 如何测试列表中所有字符的长度并根据长度调整 Output( 的位置?

python - 将数据发布到 django 管理表单

python - 如何迭代字符串中的某些字符和其他字符在python中保持相同位置

C++ 优先级队列 vector/列表?

php - 从 SQL 表中随机选择 2 行

PHP & MYSQL - ORDER BY id 有时不返回任何内容

C#/XNA伪随机数创建

python - 如何对 Pandas 数据框中的时间值执行逻辑测试

python - (Python) 使用 for 循环打印文本文件中重复出现的字符