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

2025-03-05 09:15:00
admin
原创
79
摘要:问题描述:假设我有一个长度未知的列表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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2793  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1710  
  建设工程项目管理是确保项目顺利实施并达成预期目标的关键。有效的项目管理能够协调各方资源,降低风险,提高项目的成功率。以下将详细解析建设工程项目管理的五大关键步骤。项目启动阶段项目启动是建设工程项目的开端,这一阶段至关重要,如同大厦的基石。首先要明确项目的目标,这需要与项目的利益相关者进行充分沟通,包括业主、使用者等。了...
项目管理的五大过程   0  
  复杂项目犹如充满未知挑战的迷宫,项目管理师置身其中,需要凭借卓越的能力和有效的策略来引领项目走向成功。在面对复杂项目时,项目管理师往往会遭遇诸多难题,从错综复杂的需求到难以协调的团队成员,从不断变化的外部环境到资源的紧张分配,每一个环节都可能成为项目推进的阻碍。然而,只要掌握正确的解决方案,项目管理师就能在复杂的局面中...
工程项目管理   0  
  项目管理是确保项目顺利进行并达成目标的关键活动,涉及众多方面的要素。理解并有效管理这些核心要素,对于项目的成功起着决定性作用。以下将详细阐述项目管理的七大核心要素。项目目标项目目标是项目存在的根本理由,它为整个项目的开展指明方向。明确、具体且可衡量的目标是项目成功的基石。首先,目标要清晰界定,不能模糊不清。例如,一个软...
工程项目管理办法   0  
热门文章
项目管理软件有哪些?
曾咪二维码

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

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

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用