2014-04-03 6 views
0

안녕하세요, 저는 방금 파이썬으로 프로그램을 작성하는 것을 배우고 있었고 한 지점에서 멈추었습니다. 너희들이 설명하고 도와 줄 수 있기를 바랐다. 미리 감사드립니다. 나는 동물을 인쇄 할 때python list.remove() function error

items=[] 
animals=[] 
station1={} 
station2={} 
import os.path 

def main(): 
    endofprogram=False 
    try: 
     filename=input('Enter name of input file >')   
     file=open(filename,'r') 
    except IOError: 
     print('File does not exist') 
     endofprogram=True  

    if (endofprogram==False): 
     for line in file: 
      line=line.strip('\n') 
      if (len(line)!=0)and line[0]!='#': 
       (x,y,z)=line.split(':') 
       record=(x,y,z) 
       temprecord=(x,z) 
       items.append(record) 
       animals.append(x) 

       if temprecord[1]=='s1': 
        if temprecord[0] in station1: 
         station1[temprecord[0]]=station1[temprecord[0]]+1 
        else: 
         station1[temprecord[0]]=1 
       elif temprecord[1]=='s2': 
        if temprecord[0] in station2: 
         station2[temprecord[0]]=station2[temprecord[0]]+1 
        else: 
         station2[temprecord[0]]=1 
    print(animals) 
    for x in animals: 
     while animals.count(x)!=1: 
      animals.remove(x) 
    animals.sort() 

    print(animals) 


main() 

은 그래서 하나까지 제거 얻을 목록의 요소 ['a01', 'a02', 'a02', 'a02', 'a03', 'a04', 'a05'] 모든 a02을 제외하고 남아를 인쇄합니다. 이것이 왜 예외인지 나는 모른다.

File: 

a01:01-24-2011:s1 
a03:01-24-2011:s2 
a03:09-24-2011:s1 
a03:10-23-2011:s1 
a04:11-01-2011:s1 
a04:11-02-2011:s2 
a04:11-03-2011:s1 
a04:01-01-2011:s1 
+3

반복하는 동안 목록을 변경하는 것은 위험합니다. 시도 할 빠른 것 :'동물의 x : [:] :'. 그래도 질문이 있습니다. 대신에 세트를 사용할 수없는 이유는 무엇입니까? – Joe

+0

Hey @Joe 아직 세트에 대해 알지 못했습니다. 그래서 나는 내가 배운 것을 사용하는 것만 허용됩니다! 반복하는 동안 목록을 변경하려면 위험합니까? – Newbie

+2

반복, 일명 각 요소를 살펴 보겠습니다. for 루프와 while 루프를 사용하여'animals'리스트를 두 번하고 있습니다. 당신이 반복하고있는리스트를 수정하려고한다면 (당신이하는 것처럼), 파이썬은 버그를 빠뜨릴 수있다. 그것이 당신이보고있는 것입니다. 세트를 사용할 수 없다면, 내가 제안한 것을 사용하여 반복 할 것을 제안합니다.리스트 자체 대신 소프트 카피를 반복합니다. – Joe

답변

0

당신은 목록에서 중복을 제거하는 목적에서 set을 사용할 수

list(set(animals)) 

을 대신 당신은 목록을 수정하는이

for x in animals: 
    while animals.count(x)!=1: 
     animals.remove(x) 
+1

안녕하세요. 그 기능에 대해 몰랐습니다. 그것에 대해 확실히 읽을 것입니다! 내가 전에 사용했던 것만 큼 쉽지 않았기 때문에 나는 다른 방식으로하고 있었다. – Newbie

+0

@ 새비지 문제 없음 :) [제발 받아 들일 수 (http://meta.stackexchange.com/a/5235/203656) 내 대답? –

+1

나는 그 일을 시도했다. 7 분 동안 받아 들일 수 없다고 하던데요? 왜 그런지 모르겠다 – Newbie

0

을하는, 따라서 오류를 탐색하는 동안 .

>>> animals 
['a01', 'a02', 'a02', 'a02', 'a03', 'a04', 'a05'] 
>>> for x in animals: 
... animals.remove(x) 
... 
>>> animals 
['a02', 'a02', 'a04'] 

당신이 x을 제거

은, 동물이 변경되므로 for 트랙을 잃을 수 있습니다 :이 고려 :

>>> list(set(animals)) 
['a02', 'a03', 'a01', 'a04', 'a05'] 
>>> a2=list(set(animals)) 
>>> a2.sort() 
>>> a2 
['a01', 'a02', 'a03', 'a04', 'a05'] 

편집 : 당신이 당신의 문제를 위해 할 수있는 일

sests을 사용하고 있습니다 그것이 있었던 곳의. 목록을 탐색하려면 사본을 만들어 사본을 찾아야합니다.

>>> animals=['a01', 'a02', 'a02', 'a02', 'a03', 'a04', 'a05'] 
>>> for x in animals[:]: 
... animals.remove(x) 
... 
>>> animals 
[] 
+0

왜 'ao2'에 대한 오류가 있으며 다른 것들은 코드에 따라 작동하고 있습니까? 어떤 생각? – Newbie

+1

내가 이전에 말했던 것처럼. 치는. :) 그냥 참고하시기 바랍니다, 두 번째 솔루션이 작동하지 않습니다. 하나의 조정은 현재 요소가리스트에 두 번 이상 존재하는지 검사하는 if 조건을 추가하는 것입니다. – Joe

+0

@ 새우 내 대답을 업데이트했습니다. – fredtantini