【问题标题】:Using Random in Python's list comprehension在 Python 列表理解中使用 Random
【发布时间】:2014-08-29 09:18:36
【问题描述】:

我有一个名为 words 的单词列表,我想生成一个包含 100 个名为 pwds 的三个单词元素的列表。 我希望从 words 列表中为 pwds 列表的每个元素随机挑选这 3 个单词,并且我想使用列表理解来执行此操作。

此解决方案有效:

pwds = [random.choice(words)+' '+random.choice(words)+' '+random.choice(words) for i in range(0,100)]

它会生成一个如下所示的列表:['correct horse battery', 'staple peach peach', ...]

但我正在寻找一种防止重复 3 次的方法random.choice(words),所以我尝试了这个:

pwds = [(3*(random.choice(words)+' ')).strip() for i in range(0,100)]

但不幸的是,这种解决方案会使每个元素出现 3 次相同的单词(例如:['horse horse horse', 'staple staple staple', ...]),这可能会发生。

你知道一种方法来选择 3 个随机词不重复 (编辑:“重复”,我的意思是代码重复,而不是随机词重复)

编辑:我的问题与它被标记为重复的问题不同,因为我在这里寻找使用列表理解。我知道如何生成不同的数字,我只是在寻找具体的方法。

【问题讨论】:

  • @jonrsharpe:这个功能很棒,我想出了这个解决方案:pwds = [' '.join(random.sample(words,3)) for i in range(0,100)]。但是这个功能可以防止同一个词在同一个元素中出现 2 或 3 次的可能性。

标签: python list random list-comprehension


【解决方案1】:

如果您希望单词能够在每个三连音中重复,我认为您想要的是:

pwds = [" ".join(random.choice(words) for _ in range(3)) for _ in range(100)]

注意_ 的使用表明我们实际上并没有使用range 生成的数字,而且range(0, n)range(n) 相同。

一个稍微短一些的例子:

>>> import random
>>> words = ['correct', 'horse', 'battery', 'staple']
>>> [" ".join(random.choice(words) for _ in range(3)) for _ in range(5)]
['horse horse correct', 
 'correct staple staple', 
 'correct horse horse', 
 'battery staple battery', 
 'horse battery battery']

【讨论】:

  • 谢谢,这正是我想要的!也感谢您的编码建议。
【解决方案2】:

您可以使用连接函数和列表推导不重复 random.choice

pwds = [' '.join([random.choice(words) for _ in range(3)]) for _ in range(100)]

【讨论】:

  • 虽然它与 jonrsharpe 的答案相同,但您的答案有助于理解我们使用的是嵌套列表理解,一开始我并不理解。
  • 绝对,jonrsharpe 比我快。
  • 实际上,这比我的方法稍微好一点,因为将列表(而不是纯生成器表达式)传递给 str.join 更有效 - 请参阅 stackoverflow.com/a/9061024/3001761
  • @jonrsharpe:感谢您的澄清
  • @SeevenByakko 没问题。三个项目没有太大区别,但值得了解。
猜你喜欢
  • 2012-06-02
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
相关资源
最近更新 更多