【问题标题】:Deleting elements from list depending on randomly generated number根据随机生成的数字从列表中删除元素
【发布时间】:2017-12-07 20:53:24
【问题描述】:

这个函数应该获取一个病毒列表,如 [ATCG, GTAC.....] 和一个代表病毒死亡/从列表中删除的几率的死亡率概率(介于 0 和 1 之间的浮点数)。它应该返回一个包含剩余病毒的新列表。每种病毒都有各自的死亡机会,因此如果死亡率概率为 0.6,则应该有大约 60% 的病毒剩余。

它应该在 2 行中可行(包括 def kill(viruses, deathProb):) 和我使用列表推导的代码行。

def kill(viruses, mortalityProb):
    for i in viruses:
        if random.randint(0, 100) < (mortalityProb * 100):
            del i
    return viruses

这不太行,但我不明白为什么。

【问题讨论】:

  • del i 表示“取消分配i 变量”。仅此而已;它不会从任何列表中删除任何对象。
  • 一种方法是viruses.remove(i)。但是,请参阅有关在迭代列表时更改列表的各种帖子。
  • @Prune 给出了很好的答案,但是,请记住,编写单行代码不是 pythonic 方式,编写可读代码是最佳实践!但是现在,@Prune 的答案仍然具有足够的可读性,尽管您可以导入 from random import random 而不是 import random,因此您可以使用 random() 而不是 random.random() 以节省空间并增加可重复性。

标签: python python-3.x list random


【解决方案1】:

一种方法是virus.remove(i)。但是,请参阅有关在迭代列表时更改列表的各种帖子。

您可以将其设为单行;只需为每种病毒调用random,如果“保存抛出”有效,则将其包含在内。

return [i for i in viruses if random.random() < mortalityProb]

例如:

>>> viruses = [x for x in range(20)]
>>> [i for i in viruses if random.random() < 0.75]
[0, 1, 3, 6, 7, 9, 10, 11, 12, 13, 15, 17, 18, 19]

顺便说一句,您的变量命名错误:mortalityProb 应该描述有机体死亡而不是存活的可能性。

【讨论】:

    【解决方案2】:

    因为在 for 循环中“i”实际上不是列表中的元素。您必须实际更改病毒列表。这样的事情可能会起作用。

    def kill(viruses, mortalityProb):
        for x,i in enumerate(viruses):
            if random.randint(0, 100) < (mortalityProb * 100):
                viruses.pop(x)
        return viruses
    

    【讨论】:

    • 您通常不想在迭代列表时编辑列表。如果你不小心,可能会导致一些奇怪。
    • 确实如此。我永远记不起什么时候是问题,什么时候不是。
    • 这通常总是一个问题,除非您使用堆栈/队列从顶部弹出来获取项目。弹出会修改对象,但由于您只是从顶部拉动,所以这不是问题。
    • @SuperStew,如果您不记得什么时候是问题,什么时候不是问题,那么您可能应该找出并将其合并到此答案中,或者只是删除此答案。
    • 嗯,它不起作用...virus.pop(x) 究竟做了什么
    猜你喜欢
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 2011-05-25
    • 2016-05-17
    相关资源
    最近更新 更多