M.J BADA
40
2021-10-14 19:37:56
1
82

파이썬 리스트 비교하여 원하는 값 출력방법?


아래와 같이 a가 있습니다. 


a=[[23, 24, 25, 26, 27],[23, 24, 40, 26, 27],[23, 24, 40, 26, 27],[60, 24, 25, 26, 27]]

b=[[23,28,29,70,24],[23, 24, 30, 48, 27]]

c=[]

이 중 3의 배수를 3개 이상 포함하며

b의 각 리스트의 수 중 2개 이상 포함하는 리스트를 출력하고 싶습니다.

원하는 결과값은 아래와 같습니다. 

print(c)
===============
[[60, 24, 25, 26, 27]]


해당 식을 사용하여 테스트를 해보아도 안되고

for lst in a:
    if b in lst:
        print('포함')
    else:
        print('미포함')


도와주세요~~ㅠㅠ

0
  • 답변 1

  • occidere
    30
    2021-10-14 20:29:19 작성 2021-10-14 20:30:11 수정됨

    이렇게 짤 수도 있겠네요~


    a = [[23, 24, 25, 26, 27], [23, 24, 40, 26, 27], [23, 24, 40, 26, 27], [60, 24, 25, 26, 27]]
    
    b = [[23, 28, 29, 70, 24], [23, 24, 30, 48, 27]]
    
    c = list(
        filter(
            # 4. set 연산을 써서 b 리스트 내부의 리스트와 교집합이 2개 이상인 개수를 계산
            # => x = {60, 24, 25, 26, 27}, y = {23, 28, 29, 70, 24}, {23, 24, 30, 48, 27}
            # => x 와 y 교집합이 2개 이상이면 1 으로 할 때, 위의 y 는 각각 0, 1 이 됨
            # => 위 결과를 합한 값이 1 이상이면 b 와 교집합 개수가 2개 이상인게 하나라도 존재한다는 뜻
            lambda x: sum([1 for y in b if len(set(x).intersection(set(y))) >= 2]) > 0,
            map(
                # 3. [3의 배수 개수, 기존 리스트] 에서 기존 리스트만 뽑아냄
                #    [3, [60, 24, 25, 26, 27]] => [60, 24, 25, 26, 27]
                lambda x: x[1],
                filter(
                    # 2. 3의 배수인 원소 수가 3개 이상인 것들만 남김
                    #    (1에서 넘어온 값에서 첫번째 원소가 3의 배수 개수)
                    lambda x: x[0] >= 3,
                    map(
                        # 1. 리스트 a 의 원소 중, 3의 배수인 원소의 개수 계산 후
                        #    [3의 배수 원소 개수, 기존 리스트] 로 변환
                        # ex) [60, 24, 25, 26, 27] => 3 의 배수인 원소 개수 = 3
                        #     [3, [60, 24, 25, 26, 27]]
                        lambda x: [sum([1 for e in x if e % 3 == 0]), x],
                        a
                    )
                )
            )
        )
    )
    
    # 결과: [[60, 24, 25, 26, 27]]
    print(list(c))
  • 로그인을 하시면 답변을 등록할 수 있습니다.