我有一个列表,排列如下: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/