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
@Gabrielrandom中选择随机子列表。选择
无论如何,检查更新的回答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]]