python 리스트에서 반복적으로 insert나 delete할 때 문제 질문합니다.

조회수 412회

python에서 for loop를 활용해서 데이터를 반복적으로 제거하면 loop가 돌아갈 면서 이미 데이터를 지워서 원하는 결과를 못 찾는 경우를 해결하고 싶습니다.

data = [1, 2 , 3, 4, 5, 6]

for i in range(len(data)):
    if data[i] < 5:
        del(data[i])
data = [2, 3, 4, 5]

for i in range(len(data)):
    if data[i] < 4:
        data.insert(i, 'a')

위에 insert의 경우도 유사하게 문제가 나오는 것 같은데,

원하는 결과는 4보다 작은 숫자라고 판별난 2, 3 뒤에 'a'라는 문자열이 들어왔으면 좋겠습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 빈 배열을 새로 생성해서 조건에 따라 숫자 혹은 숫자와 문자열을 추가하는 방식으로는 해결하시는건 어떠세요? HIAOAIH 2019.12.31 12:53

2 답변

  • 또 다른방법도 적어봅니다.

    1~4 를 삭제할 것이 아니라 4보다 큰 것만 선택해도 됩니다.

    In [1]: data = [1, 2 , 3, 4, 5, 6]
    
    In [2]: data = [i for i in data if i > 4] # 4보다 큰 것만 선택                                       
    
    In [3]: data                                                                    
    Out[3]: [5, 6]
    
    • set 를 이용한 방법.

    set 은 집합으로 중복요소 없는 list 와 유사하고 다양한 집합연산이 가능합니다 그중 +, - 같은 연산도 포함됩니다.

    In [1]: data = [1, 2 , 3, 4, 5, 6]
    
    In [2]: data = list(set(data) - {i for i in data if i < 5}) # 집합에서 5보다 작은것 뺌
    
    In [3]: data                                                                   
    Out[3]: [5, 6]
    
    • f'' 을 이용한 interpolation 처리(python 3.6 이상)
    In [1]: data = [2, 3, 4, 5]                                                    
    
    In [2]: data = [f'{i}a' for i in data if i < 4]                                
    
    In [3]: data                                                                   
    Out[3]: ['2a', '3a']
    
    • 반복에 사용하는 기본모듈인 itertools 의 chain 를 이용하면 편하게 할 수 있습니다.
    In [20]: data = [2, 3, 4, 5]                                                    
    
    In [21]: import itertools as it                                                 
    
    In [22]: pair_data = [(i, 'a') for i in data if i < 4]                          
    
    In [23]: pair_data                                                              
    Out[23]: [(2, 'a'), (3, 'a')]
    
    In [24]: list(it.chain(*pair_data))    # flattern 처리                                         
    Out[24]: [2, 'a', 3, 'a']
    
  • 일반적으로 말해서, 어떤 배열/목록을 순회하는 도중에 그 배열의 길이를 바꾸는 것은 매우 좋지 않은 아이디어입니다.

    혹시 원하시는 것은 filter() 그리고 map()이 아닐런지요??

    data = [1, 2, 3, 4, 5, 6]
    data = filter(lambda x: x < 5, data)
    print(data) # [1, 2, 3, 4]
    
    data = [2, 3, 4, 5]
    data = map(lambda z: str(z) + 'a', filter(lambda y: y < 4, data))
    print(data) # ['2a', '3a']
    
    • 감사합니다. 1번은 제가 생각한 의도가 맞습니다. 그런데 2번은 2,3이라는 숫자 뒤에 글자가 붙는게 아니고, 다음 인덱스에 항목이 들어가는 것을 생각했습니다.print(data) #[2, 'a', 3, 'a'] 답변 감사합니다 :-) 알 수 없는 사용자 2019.12.31 09:02

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)