我有一个包含许多列表的文件。我想访问从每个列表中检索的值的索引。我使用随机函数,如下所示。它可以很好地检索值,但我需要获取所获得值的索引。
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
说,检索到的两个值不在列表中,即使它们存在......
答案 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]
请注意,indexes
和values
的顺序与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)
您将获得两次随机样本,这会导致两个不同的随机样本。