获取从random.sample(list,2)中检索的值的索引?

时间:2015-03-19 10:10:57

标签: python list random indexing

我有一个包含许多列表的文件。我想访问从每个列表中检索的值的索引。我使用随机函数,如下所示。它可以很好地检索值,但我需要获取所获得值的索引。

for i in range(M):
           print(krr[i])
           print(krr[i].index(random.sample(krr[i],2)))
           nrr[i]=random.sample(krr[i],2)

           outf13.write(str(nrr[i]))
           outf13.write("\n")

我得到ValueError说,检索到的两个值不在列表中,即使它们存在......

4 个答案:

答案 0 :(得分:1)

您可以尝试在enumerate()个对象上使用list

根据Python官方文档

  

enumerate():返回一个枚举对象。序列必须是一个序列,一个迭代器,   或其他支持迭代的对象。 next()方法   enumerate()返回的迭代器返回一个包含a的元组   count(从默认为0的开始)和从中获得的值   迭代序列

一个简单的例子是:

my_list=['a','b','c']

for index, element in enumerate(my_list):
    print(index, element)

#    0 a
#    1 b
#    2 c

不知道我是否理解了这个问题。

答案 1 :(得分:1)

要检索列表中随机选择的值的索引,您可以使用enumerate来返回索引,并将iterable的值作为元组返回:

import random
l = range(10) # example list
random.shuffle(l) # we shuffle the list
print(l) # outputs [4, 1, 5, 0, 6, 7, 9, 2, 8, 3]
index_value = random.sample(list(enumerate(l)), 2)
print(index_value) # outputs [(4, 6), (6, 9)]

此处选择了第4个值6和第6个值9 - 当然每次运行都会返回不同的内容。

同样在您的代码中,您打印的是krr[i]的第一个样本,然后在下一行重新对其进行采样,并将其分配给nrr[i]。这两次调用会产生不同的样本,可能会导致IndexError

OP评论后编辑

最明确的方式然后将值与索引分开:

indexes = []
values = []
for idx, val in index_value:
    indexes.append(idx)
    values.append(val)
print indexes # [4, 6]
print values # [6, 9]

请注意,indexesvalues的顺序与index_value的顺序相同。

答案 2 :(得分:1)

如果需要重现结果,则可以使用random.seed(123)例如为随机生成器添加种子。这样,每次运行代码时,您都会得到相同的随机结果。

在这种情况下, bvidal 提供的可接受的解决方案如下所示:

import random
l = list(range(10)) # example list (please notice the explicit call to 'list')
random.seed(123)
random.shuffle(l) # shuffle the list
print(l) # outputs [8, 7, 5, 9, 2, 3, 6, 1, 4, 0]
index_value = random.sample(list(enumerate(l)), 2)
print(index_value) # outputs [(8, 4), (9, 0)]

另一种方法是使用标准库中的随机样本函数random.sample来随机获取索引数组,并使用这些索引从列表中随机选择元素。访问元素的最简单方法是将列表转换为numpy数组:

import numpy as np
import random
l = [1, -5, 4, 2, 7, 4, 8, 0, 9, 3]
print(l) # prints the list
random.seed(1234) # seed the random generator for reproducing the results
random_indices = random.sample(range(len(l)), 2) # get 2 random indices
print(random_indices) # prints the indices
a = np.asarray(l) # convert to array
print(list(a[random_indices])) # prints the elements

代码输出为:

[1, -5, 4, 2, 7, 4, 8, 0, 9, 3]
[7, 1]
[0, -5]

答案 3 :(得分:0)

您将获得两次随机样本,这会导致两个不同的随机样本。