파이썬 코딩, 작동오류 (초보)

조회수 1666회
  • 코딩내용: 정수인 입력값(data)을 받아서 하나만 나타나는 요소를 제거하고 싶어요.

ex. [1,2,2,4,5]-> [2,2] // [1,4,4,4,6,8,8]->[4,4,4,8,8] // [1,2,3,4,5] ->[]

(문제원문: You are given a non-empty list of integers (X). For this task, you should return a list consisting of only the non-unique elements in this list. To do so you will need to remove all unique elements (elements which are contained in a given list only once). When solving this task, do not change the order of the list. Example: [1, 2, 3, 1, 3] 1 and 3 non-unique elements so the result will be [1, 3, 1, 3].// 문제 출처: empire of code)

질문

  1. 한 번만 언급되는 요소를 result값에서 remove를 하였는데, 왜 data값에서 remove되는 것인지 모르겠어요. ㅠㅠ
  2. else에서 처럼 해당사항이 없을 경우 아무것도 하고 싶지 않은데, 보통 이럴때는 어떻게 작성해야하나요. 아무 것도 안넣으면 오류가 나서 저는 그냥 아무 변수를 하나 선언하였는데 다른 방법은 없나요?

긴글 읽어주셔서 감사합니다.

def non_unique(data):
    result = data

    for i in data:        
        if data.count(i) == 1:
            result.remove(i)
        else:
            n=0

    return result

#아래내용은 코딩내용과 무관합니다.

if __name__ == "__main__":
    # These "asserts" using only for self-checking and not necessary for auto-testing
    # Rank 1
    assert isinstance(non_unique([1]), list), "The result must be a list"
    assert non_unique([1, 2, 3, 1, 3]) == [1, 3, 1, 3], "1st example"
    assert non_unique([1, 2, 3, 4, 5]) == [], "2nd example"
    assert non_unique([5, 5, 5, 5, 5]) == [5, 5, 5, 5, 5], "3rd example"
    assert non_unique([10, 9, 10, 10, 9, 8]) == [10, 9, 10, 10, 9], "4th example"

    # Rank 2
    assert non_unique(['P', 7, 'j', 'A', 'P', 'N', 'Z', 'i',
                       'A', 'X', 'j', 'L', 'y', 's', 'K', 'g',
                       'p', 'r', 7, 'b']) == ['P', 7, 'j', 'A', 'P', 'A', 'j', 'p', 7], "Letters"

    print("All done? Earn rewards by using the 'Check' button!")


  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

    1. deep copy 문제입니다. 아래의 링크를 참조하세요 http://add2paper.github.io/2014/12/01/More-Python-1-Copy/

    2. 아래처럼 pass를 써주시면 됩니다.

    if 1:
        print "Hello"
    else :
        pass
    
    • (•́ ✖ •̀)
      알 수 없는 사용자
  • count가 1인 원소를 앞에서부터 지우면 문제가 발생합니다..

    작성자님, 혹시

    data = [1, 2, 3, 4]
    
    for i in data: 
        data.remove(i)
    

    을 실행했을 때 data 리스트의 모든 원소가 삭제된다고 생각하시나요?

    실제로는 홀수 인덱스의 원소만 삭제됩니다.


    다음은 예제 코드와 실행 결과입니다.

    <코드>
    
    data = [10, 20, 30, 40]
    
    for i in data:
        print('data 리스트 = ', data)
        print('i 값  = ', i , '\n')
        data.remove(i)
    
    print('최종 data 리스트 : ', data)
    
    <결과>
    
    data 리스트 =  [10, 20, 30, 40]
    i 값  =  10
    
    data 리스트 =  [20, 30, 40]
    i 값  =  30
    
    최종 data 리스트 :  [20, 40]
    

    처음 remove(i)를 통해 10이 제거 된 뒤, i는 20이 되지 않고 30이 됩니다. 우리는 i가 초기 data 리스트의 두 번째 인자인 20이 되길 원했지만
    remove()에 의해 10이 제거되었고, 그에 따라 리스트의 두 번째 인자가 30으로 바뀌었기 때문입니다.

    따라서 저는, count가 1인 원소의 인덱스들을 리스트에 저장하고, 리스트의 뒤에서부터 지워주기 위해서 reverse()를 호출한 뒤 삭제해주었습니다.


    import copy
    
    def f(data):
    
        res = copy.deepcopy(data)
        del_list = []
        index = 0
    
        for i in res:
            if res.count(i) == 1:
                del_list.append(index)        
            index += 1
    
        del_list.reverse()
    
        for i in del_list:
            del res[i]
    
        return res
    

    더 간단하게 해결할 수 있는 방법도 있을 것입니다..

    • (•́ ✖ •̀)
      알 수 없는 사용자

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

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

(ಠ_ಠ)
(ಠ‿ಠ)