首页 > 解决方案 > 在Python中同时从列表中获取随机值及其位置

问题描述

我想知道 Python 中是否有一种方法可以同时从列表中获取它的随机值及其位置

我知道我可以分两步做到这一点:

list_index = random.randrange(len(my_list))
list_value = my_list[index]

如果 list 中有 0 值,我也想排除。我不能使用 random() 1st 来获取位置,因为这样我需要递归调用 random() 直到我没有得到 0。

另一种可能性是调用 random() 来获取列表中的值并排除 0,但是使用此实现,例如,如果有两个(或更多)相同的值,Python 会输出第一个位置:

Example:

    [3 5 6 8 5 0]
    Random's output value = 5
    Position = 1

    But 5 value is also in position 4

我该如何实施?可行吗?我一直在网上思考和搜索,但找不到任何东西。

真的提前谢谢你。

亚历克斯

标签: pythonlistrandomposition

解决方案


python 3.7之前,您可以使用列表的enumerate()d 值列表 - 由于内存消耗,这可能会在长列表中中断:

data = [3, 5, 6, 8, 5, 7]

import random

pos, item = random.choice(list(enumerate(data)))

print("pos:", pos, "itemvalue:", item)

输出:

pos: 2 itemvalue: 6

使用python 3.8,您可以使用walrus 运算符,使其适用于任何长度的列表:

data = [3, 5, 6, 8, 5, 7]

import random 
print("pos:", p := random.choice(range(len(data))), "itemvalue:", data[p]) 

输出:

pos: 0 itemvalue: 3

第一个变体从包含位置和值的元组中进行选择 - 第二个变体在列表中选择一个随机索引并访问该位置的列表以获取值。


您从输入列表中获取随机值 - 为避免零,您可以循环直到获得非零值:

data = [0, 0, 5, 0, 0, 5, 0, 0, 5]

import random

for _ in range(10):
    item = 0
    while item == 0:
        pos, item = random.choice(list(enumerate(data)))
        # pos, item = (p := random.choice(range(len(data))), data[p]) 
    print("pos:", pos, "itemvalue:", item)

输出:

pos: 8 itemvalue: 5     
pos: 8 itemvalue: 5
pos: 5 itemvalue: 5
pos: 8 itemvalue: 5
pos: 2 itemvalue: 5
pos: 5 itemvalue: 5
pos: 2 itemvalue: 5
pos: 8 itemvalue: 5
pos: 5 itemvalue: 5
pos: 8 itemvalue: 5

推荐阅读