Python 具有列表替换功能的简单引导

Python 具有列表替换功能的简单引导,python,random,Python,Random,我正在尝试执行一个简单的引导过程,替换应用于如下格式的列表: a = [[0.2,0.5,0.4,0.8], [0.3,0.7,0.1,0.6], [0.3,1.2,1.0,0.6], ....] 也就是说:a是由N子列表组成的列表,每个子列表具有相同数量的浮动(在本例中为4个) 为了从a中选择随机元素(即:子列表)并替换以执行引导过程,我可以执行以下操作: import random bts_a = [] for elem in a: r = random.randint(0,le

我正在尝试执行一个简单的引导过程,替换应用于如下格式的列表:

a = [[0.2,0.5,0.4,0.8], [0.3,0.7,0.1,0.6], [0.3,1.2,1.0,0.6], ....]
也就是说:
a
是由
N
子列表组成的列表,每个子列表具有相同数量的浮动(在本例中为4个)

为了从
a
中选择随机元素(即:子列表)并替换以执行引导过程,我可以执行以下操作:

import random

bts_a = []
for elem in a:
    r = random.randint(0,len(a))
    bts_a.append(a[r])
有没有更简洁和/或更快的方法来实现这一点?我特别不喜欢必须初始化一个空列表(即:
bts_a=[]
),这让我感觉非常不舒服。

您可以使用并列出理解或映射:

a = [[0.2, 0.5, 0.4, 0.8], [0.3, 0.7, 0.1, 0.6], [0.3, 1.2, 1.0, 0.6]]

>>> [random.choice(e) for e in a]
[0.5, 0.6, 0.6]
>>> [random.choice(e) for e in a]
[0.4, 0.3, 1.2]

>>> map(random.choice, a)
[0.5, 0.1, 1.0]
>>> map(random.choice, a)
[0.8, 0.3, 0.3]
要从列表中选择随机子列表,请执行以下操作:

>>> random.choice(a)
[0.3, 0.7, 0.1, 0.6]
>>> random.choice(a)
[0.2, 0.5, 0.4, 0.8]

bts_a = [random.choice(a) for _ in a]
>>> bts_a
[[0.3, 1.2, 1.0, 0.6], [0.2, 0.5, 0.4, 0.8], [0.3, 1.2, 1.0, 0.6]]

这将使用以下方法为您提供随机子列表:

 >>> print a[int(random()*len(a))]
 [0.3, 1.2, 1.0, 0.6]
 >>> a
 [[0.2, 0.5, 0.4, 0.8], [0.3, 0.7, 0.1, 0.6], [0.3, 1.2, 1.0, 0.6]]
 >>> from random import random
 >>> print a[int(random()*len(a))]
 [0.2, 0.5, 0.4, 0.8]
 >>> print a[int(random()*len(a))]
 [0.3, 0.7, 0.1, 0.6]
 >>>

我想你要找的是:

请注意,它会以内联方式更改列表。如果你想要一个不同的列表。您需要创建一个副本:

bts = a[:]
random.shuffle(bts)
例如:

>>> a = [[0.2, 0.5, 0.4, 0.8], [0.3, 0.7, 0.1, 0.6], [0.3, 1.2, 1.0, 0.6]]
>>> import random
>>> random.shuffle(a)
>>> a
[[0.3, 0.7, 0.1, 0.6], [0.2, 0.5, 0.4, 0.8], [0.3, 1.2, 1.0, 0.6]]

您可能应该看看对pythonic代码最直接的转换是
bts_a=[a[random.randint(0,len(a)-1)],对于范围内的元素(len(a))]
。这不是更糟,但也绝不是更好。我不是试图从每个子列表中选择随机浮动,我是试图从
a
@Gabriel
random中选择随机子列表。选择
无论如何,检查更新的回答OK,我使用了
random.choice
这似乎是解决这个问题的推荐方法,并得出了这一行:
bts\u a=[random.choice(a)for u.in a]
。如果您愿意,您可以将其添加到您的答案中,它将取代我在问题中介绍的完整
for
循环。干杯,谢谢。我没有理由在范围(len(a))中使用
而不是在a
中简单地使用
for。你能解释一下这两种方法之间的区别吗?@Gabriel hm,你是对的,实际上它比随机模式中的uu的
要慢一点(python2中的xrange)。shuffle
只移动元素。替换意味着最终列表中的某些元素将被重复。顺便说一句,我没有否决你的答案,我从来没有否决过。干杯,谢谢。没问题。为什么要重复元素?使用random.choice()和一个如此random.shuffle的列表理解可能永远不会重复某些元素。因为这就是带替换的引导过程所做的(你可以用谷歌搜索它),因为它永远不会重复元素,所以Shuffling永远不会是等价的,甚至一个都没有。@AlexandruPlugaru:Shuffling每次都会产生一个具有完全相同的统计信息(均值、方差、中位数等)的样本,而不替换的采样将产生一个样本,其(均值、方差等)是围绕原始样本统计信息的随机变量。更重要的是,替换采样产生的值在统计上相互独立。
bts = a[:]
random.shuffle(bts)
>>> a = [[0.2, 0.5, 0.4, 0.8], [0.3, 0.7, 0.1, 0.6], [0.3, 1.2, 1.0, 0.6]]
>>> import random
>>> random.shuffle(a)
>>> a
[[0.3, 0.7, 0.1, 0.6], [0.2, 0.5, 0.4, 0.8], [0.3, 1.2, 1.0, 0.6]]