如何随机替换嵌套列表中的特定元素?
How to randomly replace a specific element in a nested list?
我有一个列表列表。如何创建一个随机将 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
,不多不少,并创建一个 new 列表。旧列表保持不变。
您也可以就地进行替换,但在那种情况下我会 return 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]]
您可以执行如下操作
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 的实例替换为另一个数字的函数?
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
,不多不少,并创建一个 new 列表。旧列表保持不变。
您也可以就地进行替换,但在那种情况下我会 return 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]]
您可以执行如下操作
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)