2017-12-07 4 views
0

이 함수는 바이러스가 죽을 확률을 나타내는 [ATCG, GTAC .....] 및 mortalityProb (0과 1 사이의 부동 소수점)와 같은 바이러스 목록을 가져야합니다/목록에서 삭제하십시오. 나머지 바이러스와 함께 새 목록을 반환해야합니다. 각각의 바이러스는 죽을 수있는 개별 기회를 가지므로 사망률이 0.6 일 경우 남은 바이러스의 약 60 %가 남아 있어야합니다.임의로 생성 된 번호에 따라 목록에서 요소 삭제

이것은 2 줄 (def kill (viruses, mortalityProb) : :) 및 목록 작성을 사용하는 코드 행에서 수행 할 수 있어야합니다.

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

이것은 제대로 작동하지 않지만 그 이유는 알 수 없습니다. 루프에서 "내가 '실제로는리스트의 요소가 아니기 때문에

+2

'del i'은 'i 변수'의 할당을 취소하는 것을 의미합니다. 그것은 그 이상을 수행하지 않습니다. 모든 목록에서 개체를 제거하지 않습니다. – user2357112

+1

이렇게하는 한 가지 방법은'viruses.remove (i)'입니다. 그러나 반복하면서 목록을 변경하는 다양한 게시를 참조하십시오. – Prune

+1

@Prune은 아름다운 답변을주었습니다. 단 한 줄 짜기를 쓰는 것이 파이썬적인 방법이 아니며, 읽을 수있는 코드를 작성하는 것이 가장 좋습니다! 그러나 @ Prune의 대답은'import random '대신'random import'에서'random import'를 가져올 수 있지만 여전히 읽기 쉽습니다. 따라서 random.random() 대신에 random()을 사용하여 공간을 절약 할 수 있습니다 과민성이 증가합니다. – Lycopersicum

답변

3

한 가지 방법이 바이러스입니다 .remove (i). 그러나 반복하면서 목록을 변경하는 여러 게시물을 참조하십시오.

이 링크를 한 줄로 만들 수 있으며 각 바이러스에 대해 random을 호출하기 만하면됩니다. 절약 던지기 "가 작동 함.

return [i for i in viruses if random.random() < mortalityProb] 
예를 들어

: 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] 

은 BTW, 당신은 당신의 변수가 잘못된 이름이 있습니다.

0

. 당신은 실제로 바이러스 목록을 변경해야합니다. 이런 식으로 뭔가가 작동하지 않을 수 있습니다. 할 수

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

일반적으로 목록을 반복하면서 목록을 편집하고 싶지는 않습니다. 조심하지 않으면 이상하게 느껴질 수 있습니다. – MCBama

+0

사실입니다. 그 문제가 언제 언제 아닌지 나는 결코 기억할 수 없다. – SuperStew

+0

일반적으로 스택/큐를 사용하지 않는 한 항상 문제가 있습니다. 터지는 것은 객체를 수정하지만 꼭대기에서 끌어 당기는 것이므로 문제가되지 않습니다. – MCBama