python 두 개의 리스트 안에 있는 dictionary(딕셔너리)에서 같은 value 찾아서 하나의 리스트 만드는 방법 도와주세요

조회수 2951회
 ex_list_1 = [{"name":"kim", "age":35, "height":185},{"name":"Lee", "age":15, "height":165}]
 ex_list_2 = [{"first_name":"kim", "nickname":"kkk"}]

이런 형태의 리스트가 2개 존재 할 때 ex_list_1 과 ex_list_2가 포함하고 있는 dict()들 중에 같은 value 값이 있는 것끼리 합치고 싶습니다(단, 위처럼 kim으로 같은 value값이 있는 것도 있고 없는 것도 있으며, 같은 value값의 key이름은 서로 다릅니다) 제가 희망하는 최종 모습은 아래와 같습니다

ex_final =  [{"name":"kim", "age":35, "height":185, "nickname":"kkk"},{"name":"Lee", "age":15, "height":165, "nickname":None}]

ex_final과 같이 합치고 싶은데 방법이 있을까요? 리스트 안에 딕셔러니 중에서도 같은 value값을 찾아서 넣어야하니까 생각이 안 드네요... 고수님들 도와주세요 (참고로 None값은 예시로 든 것뿐 공백 문자열이든 다른 것으로 들어가도 무방할 거 같아요)

2 답변

  • import pandas as pd
    
    ex_list_1 = [{"name":"kim", "age":35, "height":185},
                 {"name":"Lee", "age":15, "height":165}]
    ex_list_2 = [{"first_name":"kim", "nickname":"kkk"}]
    
    df1 = pd.DataFrame(ex_list_1)
    df2 = pd.DataFrame(ex_list_2)
    
    df3 = df1.merge(df2, left_on='name', right_on='first_name', how='outer')
    
    res = df3[['age', 'height', 'name', 'nickname']].to_dict(orient='records')
    
    
    [{'age': 35, 'height': 185, 'name': 'kim', 'nickname': 'kkk'},
     {'age': 15, 'height': 165, 'name': 'Lee', 'nickname': nan}]
    

    pandas dataframe 으로 바꾸어서 조작하는 게 편할 겁니다.

    이미지

  • 데이터 처리를 위한 pandas 는 다루기 편하고 훌륭한 모듈임에는 틀림없습니다만 서드파티 라이브러리이므로 설치 및 사용법을 익혀야하며 성능에서도 손해를 감수해야 합니다.

    단순한 데이터 핸들링이라면 기본 라이브러리內에서 처리하는 것이 간결한 코드를 유지하는 좋은 방법이 될 수 있습니다.

    In [1]: ex_list_1 = [{"name":"kim", "age":35, "height":185},{"name":"Lee", "age" :15, "height":165}]                                                     
    
    In [2]: ex_list_2 = [{"first_name":"kim", "nickname":"kkk"}]
    
    In [3]: def mergeMembership(D1, D2): 
        ...:     temp = {**D1} 
        ...:     for k1, v1 in D1.items(): 
        ...:         for k2, v2 in D2.items(): 
        ...:             if v1 == v2:    # 값이 같은지 여부 
        ...:                 temp.update(D2) 
        ...:                 temp.pop(k2)    # 중복요소(first_name) 제거 
        ...:                 return temp 
        ...:             else: 
        ...:                 if k2 != 'first_name': temp[k2] = None # first_name 에 대한 조건이 명확치 않음 
        ...:         return temp                                                                                                                
    
    In [4]: mergeMembership(ex_list_1[0], ex_list_2[0])                                                                            
    Out[4]: {'name': 'kim', 'age': 35, 'height': 185, 'nickname': 'kkk'}
    
    In [5]: mergeMembership(ex_list_1[1], ex_list_2[0])                                                                            
    Out[5]: {'name': 'Lee', 'age': 15, 'height': 165, 'nickname': None}
    

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

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

(ಠ_ಠ)
(ಠ‿ಠ)