python - 从列表中返回随机子子列表及其索引

标签 python list random

我有一个列表,排列如下:N 个子列表和 N_i 个子列表,每个子列表中有 >N_i 在整个子列表中不一定相等。每个子子列表包含两个元素(这对所有子子列表都是如此)。这是带有 3 个子列表和 4、3、5 和 1 个子列表的简短版本的列表:

a = [[[0.3, 1.2], [0.3, 2.3], [0.3, 4.6], [0.3, 3.4]], [[0.6, 4.5], [0.6, 2.5], [0.6, 7.8]], [[0.2, 1.4], [0.2, 6.3], [0.2, 5.2], [0.2, 2.1], [0.2, 3.6]], [[0.4, 1.3]]]

我需要一种方法来从所有可用的列表中随机选择一个子列表并存储指向它的索引。

我可以使用 random.choice并做:

import random.choice as r_c
s_s_list = r_c(r_c(a))
print s_s_list
[0.6, 7.8]

这有效地返回了所有可用的随机子子列表,但它有以下问题:

a- 它没有给我指向它的 i,j 索引(在本例中:[1, 2]),我不能直接使用a.index(s_s_list) 因为它是一个sub-sub-list

b- 因为我需要重复此过程 M 次以获得 M 随机 distinct 子子列表(以及索引指向他们)这是行不通的。

c- 正如在评论中指出的那样,这使得被挑选到元素较少的子列表中的那些子子列表的概率更高,我需要以相同的概率挑选每个子子列表.

最佳答案

要跟踪索引,您可以 (a) 随机选择索引,并使用它们来检索子列表;或者 (b) 使用 enumerate 将索引放入您的列表。

由于您想要不放回地抽样(即 M distinct sub-sub-lists),请使用 random.sample 而不是 M 调用 random.choice。要以相等的概率在子列表中进行选择,您必须首先“展平”列表。在添加索引的同时很容易做到这一点。

下面是如何使用 enumerate 来做到这一点:

a_flat = [(i, j, item) for i, sublst in enumerate(a) for j, item in enumerate(sublst)]
choices = random.sample(a_flat, 3)

for c in choices:
    print c

(2, 3, [0.2, 2.1])
(3, 0, [0.4, 1.3])
(1, 0, [0.6, 4.5])

关于python - 从列表中返回随机子子列表及其索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21236219/

相关文章:

python - 用切片对象替换列表的第 i 个元素

java - 将动态数组中的对象存储到静态数组中-Java

c++ - 自己的 C++11 随机数分布实现

python - 由于 : file does not start with RIFF id,无法将文件 file.wav 作为 WAV 打开

python - 通过放置一个列表中的第 n 个项目和另一个列表中的其他项目来合并 Python 中的列表?

list - 如何通过不使用 "list comprehensions"获取列表中元素的索引?

java - Math.random() 运行时间与简单算术运算相比如何?

Python 2.7.5 如何从用户输入中累积和声明数组/列表中的值?

python - 在 Python Zeep 中更改服务 URL

python - 如何显示给定时区的时钟变化所经过的实际时间