【问题标题】:Random selection of list elements随机选择列表元素
【发布时间】:2021-12-30 09:06:54
【问题描述】:

目标:打印随机选择的列表元素,至少从 1 到所有,作为列表理解。

尝试:

import random

BENEFITS = ['foo', 'bar', 'idk', 'lol']

selection = [sorted(random.sample(BENEFITS, random.randint(1, len(BENEFITS))]
print(selection)

期望的输出:

foo, idk

值错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-17-407cc8d7fbfe> in <module>
----> 1 v = [[k, eval(v)] for k, v in sorted(random.sample([BENEFITS], random.randint(3, len(BENEFITS)-1)))]
      2 
      3 print(v)

~\Anaconda3\lib\random.py in sample(self, population, k)
    361         n = len(population)
    362         if not 0 <= k <= n:
--> 363             raise ValueError("Sample larger than population or is negative")
    364         result = [None] * k
    365         setsize = 21        # size of a small set minus size of an empty list

ValueError: Sample larger than population or is negative

如果还有什么我可以添加到帖子中的,请告诉我。

【问题讨论】:

  • 你为什么使用eval()
  • 你不需要在BENEFITS 周围加上[]。已经是清单了。您正在创建一个只有一个元素的新列表。
  • 觉得有帮助,打算删掉
  • random.randint(3, len(BENEFITS)-1)) 毫无意义。 len(BENEFITS)-1 是 3。所以你要求一个从 3 到 3 的随机整数,它总是 3!
  • kv 是什么?没有包含键和值的字典。

标签: python list random valueerror


【解决方案1】:

在尝试将其放入字典或作为列表理解时,我遇到了许多不同的错误。

最小代码答案:

import random

BENEFITS = ['foo', 'bar', 'idk', 'lol']

selection = sorted(random.sample(BENEFITS, random.randint(1, len(BENEFITS))))
print(selection)

【讨论】:

  • 所以列表理解不是练习的要求?
  • 对不起,我做出了错误的假设,即它必须是,基于两个原因:我想要一个单行代码,并且对象返回为一个列表。值得庆幸的是,sorted() 本身对我来说都是如此。
【解决方案2】:

您可以使用模块random 中的choices。那么

from random import choices
BENEFITS = ['foo', 'bar', 'idk', 'lol']
print(choices(BENEFITS,k=2))

这样,函数choicesBENEFITS返回一个长度为k=2的随机样本。

【讨论】:

  • 我相信 OP 也希望 k 是随机的。
  • 这会导致重复,如 [bar, bar];不知道这是否重要,只是想提出来。
  • 这就是choicessample的主要区别,是否允许重复。
  • 谢谢,这也有效:)
  • @StressdBoi69420 如果你不想要重复的元素,你必须使用“sample”而不是“choices”,因为“choices”可能会返回像 rv.kvetch 这样的重复项
猜你喜欢
  • 2012-03-12
  • 2013-10-19
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
相关资源
最近更新 更多