>source

코드에 문제가 있습니다. 내 코드가 여러 목록의 목록에 포함 된 2 개의 목록을 비교하지만 각 목록은 한 번만 비교하려고합니다.

resultList = [
    ['Student1', ['Sport', 'History']],
    ['Student2', ['Math', 'Spanish']],
    ['Student3', ['French', 'History']],
    ['Student4', ['English', 'Sport']],
]
for list1 in resultList:
    for list2 in resultList:
        i = 0
        for subject in list1[1]:
            if subject in list2[1]:
                if list2[1].index(subject) >= list1[1].index(subject):
                    i+=1
                else:
                    i+=2
        print(list1[0] + ' - ' + list2[0] + ' : ' + str(i))

인쇄 :

Student1 - Student1 : 2
Student1 - Student2 : 0
Student1 - Student3 : 1
Student1 - Student4 : 1
Student2 - Student1 : 0
Student2 - Student2 : 2
Student2 - Student3 : 0
Student2 - Student4 : 0
Student3 - Student1 : 1
Student3 - Student2 : 0
Student3 - Student3 : 2
Student3 - Student4 : 0
Student4 - Student1 : 2
Student4 - Student2 : 0
Student4 - Student3 : 0
Student4 - Student4 : 2

이 결과를 원합니다 :

Student1 - Student1 : 2
Student1 - Student2 : 0
Student1 - Student3 : 1
Student1 - Student4 : 1
Student2 - Student2 : 2
Student2 - Student3 : 0
Student2 - Student4 : 0
Student3 - Student3 : 2
Student3 - Student4 : 0
Student4 - Student4 : 2

도움을 주셔서 감사합니다!


  • 답변 # 1

    아이디어는 @yatu의 답변과 비슷하지만 수동으로 카운트를 유지하는 대신 enumerate 를 사용할 수 있습니다 list2 의 일부만 반복   list1 의 현재 색인 이후 . 1-1 2-2 쌍을 피하려면 resultList[idx+1:] 를 사용하십시오.   resultList[idx:] 대신 .

    resultList = [                                                                                                                 
        ['Student1', ['Sport', 'History']],                                                                                        
        ['Student2', ['Math', 'Spanish']],                                                                                         
        ['Student3', ['French', 'History']],                                                                                       
        ['Student4', ['English', 'Sport']],                                                                                        
    ]                                                                                                                              
    for idx, list1 in enumerate(resultList):                                                                                       
        for list2 in resultList[idx:]:                                                                                             
            i = 0                                                                                                                  
            for subject in list1[1]:                                                                                               
                if subject in list2[1]:                                                                                            
                    if list2[1].index(subject) >= list1[1].index(subject):                                                         
                        i+=1                                                                                                       
                    else:                                                                                                          
                        i+=2                                                                                                       
            print(list1[0] + ' - ' + list2[0] + ' : ' + str(i))
    
    

  • 답변 # 2

    itertools.combinations_with_replacement 를 사용하겠습니다  또는 itertools.combinations  이를 위해 :

    In [1]: resultList = [
       ...:     ['Student1', ['Sport', 'History']],
       ...:     ['Student2', ['Math', 'Spanish']],
       ...:     ['Student3', ['French', 'History']],
       ...:     ['Student4', ['English', 'Sport']],
       ...: ]
       ...:
    In [2]: import itertools
    In [3]: new_result = itertools.combinations_with_replacement(resultList, 2)
    In [4]: for lists_tuple in new_result:
        ...:     list1, list2 = lists_tuple
        ...:     i = 0
        ...:     for subject in list1[1]:
        ...:         if subject in list2[1]:
        ...:             if list2[1].index(subject) >= list1[1].index(subject):
        ...:                 i+=1
        ...:             else:
        ...:                 i+=2
        ...:     print(list1[0] + ' - ' + list2[0] + ' : ' + str(i))
        ...:
        ...:
    Student1 - Student1 : 2
    Student1 - Student2 : 0
    Student1 - Student3 : 1
    Student1 - Student4 : 1
    Student2 - Student2 : 2
    Student2 - Student3 : 0
    Student2 - Student4 : 0
    Student3 - Student3 : 2
    Student3 - Student4 : 0
    Student4 - Student4 : 2
    
    
    위즈 위즈

    각 목록을 자신과 비교하고 싶지 않은 경우 ( combinations  - Student1 ), Student1 변경   combinations_with_replacement 로  목록의 여러 요소를 비교할 수 있습니다 :

    combinations
    
    

  • 답변 # 3

    Student1 - Student2 : 0 Student1 - Student3 : 1 Student1 - Student4 : 1 Student2 - Student3 : 0 Student2 - Student4 : 0 Student3 - Student4 : 0 를 활용할 수 있습니다  목록을 비교하려면 :

    set.intersection
    
    

    인쇄 :

    resultList = [
        ['Student1', ['Sport', 'History']],
        ['Student2', ['Math', 'Spanish']],
        ['Student3', ['French', 'History']],
        ['Student4', ['English', 'Sport']],
    ]
    s = set()
    for list1 in resultList:
        for list2 in resultList:
            i = tuple(sorted([list1[0], list2[0]]))
            if i in s:
                continue
            s.add(i)
            print(list1[0], list2[0], len(set(list1[1]).intersection(list2[1])))
    
    

  • 답변 # 4

    원본과 비교하여 수정 된 두 줄과 새로운 줄 두 개가있는 버전 :

    Student1 Student1 2
    Student1 Student2 0
    Student1 Student3 1
    Student1 Student4 1
    Student2 Student2 2
    Student2 Student3 0
    Student2 Student4 0
    Student3 Student3 2
    Student3 Student4 0
    Student4 Student4 2
    
    

  • 답변 # 5

    보다 명확하게해야합니다

    단지 2 개의 루프와 단 3 개의 라인 :

    resultList = [
    ['Student1', ['Sport', 'History']],
    ['Student2', ['Math', 'Spanish']],
    ['Student3', ['French', 'History']],
    ['Student4', ['English', 'Sport']],
    ]
    for index1 in range(0,len(resultList)):
        for index2 in range(index1, len(resultList)):
            i = 0
            list1 = resultList[index1]
            list2 = resultList[index2]
            for subject in list1[1]:
                if subject in list2[1]:
                    if list2[1].index(subject) >= list1[1].index(subject):
                        i+=1
                    else:
                        i+=2
            print(list1[0] + ' - ' + list2[0] + ' : ' + str(i))
    
    

    결과 :

    for i in resultList:
        for j in resultList[resultList.index(i):]:
                print(str(i[0]) + '-' + str(j[0]) + ' : ' + str((np.isin(i[1], j[1]) == True).sum()))
    
    

    환영합니다 :)

    Student1-Student1 : 2 Student1-Student2 : 0 Student1-Student3 : 1 Student1-Student4 : 1 Student2-Student2 : 2 Student2-Student3 : 0 Student2-Student4 : 0 Student3-Student3 : 2 Student3-Student4 : 0 Student4-Student4 : 2

관련 자료

  • 이전 java - null 값을 무시하지 않는 ModelMapper
  • 다음 javascript - 기본값 또는 현재 날짜를 입력으로 설정하는 방법 [type ="date"]