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

2024-04-27 03:17:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张单子。如何创建一个函数,用另一个数字随机替换一个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] ]

Tags: in列表forindexrandomnumlistrow
2条回答

你可以这样做

import random

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


def random_replace10(num, lst):
    ten_index = []
    for i, item in enumerate(lst):
        for j, inner_item in enumerate(item):
            if inner_item == 10:
                ten_index.append((i, j))

    i, j = random.choice(ten_index)
    lst[i][j] = num
    print(lst)

首先需要找到有多少个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
    ]

这将恰好用num替换一个10值,不多也不少,并创建一个新的列表。旧的名单没有动。你知道吗

您也可以就地进行替换,但在这种情况下,我将返回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]]

相关问题 更多 >