从列表中弹出随机元素最具 Python 风格的方法是什么?

2025-03-05 09:15:00
admin
原创
80
摘要:问题描述:假设我有一个长度未知的列表x,我想从中随机弹出一个元素,以便列表之后不包含该元素。 最符合 Python 风格的方法是什么?pop我可以使用、random.randint和的相当不方便的组合来实现这一点len,并且希望看到更短或更好的解决方案:import random x = [1,2,3,4,5...

问题描述:

假设我有一个长度未知的列表x,我想从中随机弹出一个元素,以便列表之后不包含该元素。 最符合 Python 风格的方法是什么?

pop我可以使用、random.randint和的相当不方便的组合来实现这一点len,并且希望看到更短或更好的解决方案:

import random
x = [1,2,3,4,5,6]
x.pop(random.randint(0,len(x)-1))

我想要实现的是从列表中连续弹出随机元素。(即,随机弹出一个元素并将其移动到字典中,随机弹出另一个元素并将其移动到另一个字典中,...)

请注意,我使用的是 Python 2.6,并且没有通过搜索功能找到任何解决方案。


解决方案 1:

首先,你做的事情看起来不太符合 Python 风格。你不应该从列表中间删除内容,因为据我所知,所有 Python 实现中列表都是作为数组实现的,所以这是一个O(n)操作。

如果您确实需要此功能作为算法的一部分,则应检查支持blist从中间有效删除的数据结构。

在纯 Python 中,如果不需要访问剩余元素,您可以先对列表进行打乱,然后对其进行迭代:

lst = [1,2,3]
random.shuffle(lst)
for x in lst:
  # ...

如果你真的需要余数(在我看来,这有点代码味道),至少你pop()现在可以从列表末尾获取(速度很快!):

while lst:
  x = lst.pop()
  # do something with the element      

一般来说,如果您使用更具功能性的风格,而不是改变状态(就像您对列表所做的那样),那么您通常可以更优雅地表达您的程序。

解决方案 2:

你不会比这更好,但这里有一点改进:

x.pop(random.randrange(len(x)))

文件random.randrange()

random.randrange([start], stop[, step])

从 中返回一个随机选择的元素range(start, stop, step)。这相当于choice(range(start, stop, step)),但实际上并不构建范围对象。

解决方案 3:

如果列表其余元素的顺序无关紧要,则从列表中删除随机索引处的单个元素:

import random

L = [1,2,3,4,5,6]
i = random.randrange(len(L)) # get random index
L[i], L[-1] = L[-1], L[i]    # swap with the last element
x = L.pop()                  # pop last element O(1)

交换用于避免从列表中间删除时的 O(n) 行为。

解决方案 4:

头对头比较 ⚖

尽管许多答案建议使用random.shuffle(x),但它在处理大数据时非常慢。当启用随机播放时,元素x.pop()列表所需的时间10000约为。当禁用随机播放时,速度是6 seconds`0.2s`

fastest测试了上述所有给出的方法后,发现该方法是由@jfs 编写的,因为只触及了一个项目。

import random

L = [1,"2",[3],(4),{5:"6"},'etc'] #you can take mixed or pure list
i = random.randrange(len(L)) # get random index
L[i], L[-1] = L[-1], L[i]    # swap with the last element
x = L.pop()                  # pop last element O(1)

或者增强(niklas answer),对所有元素执行random.shuffle() (成本高昂),可以是一行:

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2796  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1710  
  PLM系统在企业项目管理中扮演着至关重要的角色,尤其是在项目采购管理方面,能够通过一系列策略提升采购效率、降低成本并保障质量。通过深入解析相关策略,企业可以更好地利用PLM系统优化采购流程,实现项目的顺利推进与整体目标的达成。需求精准定义策略在项目采购中,明确需求是首要任务。PLM系统可助力企业精准定义采购需求。首先,...
plm是什么意思   8  
  在企业的运营过程中,跨部门数据共享一直是一个关键且颇具挑战的问题。不同部门之间由于业务差异、系统不兼容等多种因素,常常形成信息孤岛,导致数据无法顺畅流通,影响企业整体的决策效率和协同效果。而 PLM 系统作为一种先进的管理工具,为解决这一难题提供了有效的途径。通过其一系列强大的核心功能,能够打破部门之间的数据壁垒,实现...
plm系统   7  
  PLM(产品生命周期管理)项目涉及产品从概念设计到退役的全流程管理,其复杂性和长期性要求高效的项目进度管理工具。甘特图作为一种直观且实用的项目进度可视化工具,在PLM项目中发挥着关键作用。通过甘特图,项目团队成员能够清晰地了解项目任务的时间安排、进度状态以及各项任务之间的关系,从而更好地协调工作、分配资源,确保项目按计...
plm流程是什么   6  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用