Programing

파이썬과 리턴 매치에서 두 목록을 비교하는 방법

lottogame 2020. 3. 3. 22:52
반응형

파이썬과 리턴 매치에서 두 목록을 비교하는 방법


두 개의 목록을 가져 와서 둘 다에 나타나는 값을 찾고 싶습니다.

a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]

returnMatches(a, b)

예를 들어을 반환 [5]합니다.


가장 효율적인 방법은 아니지만 가장 확실한 방법은 다음과 같습니다.

>>> a = [1, 2, 3, 4, 5]
>>> b = [9, 8, 7, 6, 5]
>>> set(a) & set(b)
{5}

순서가 중요한 경우 다음과 같이 목록 이해를 통해 수행 할 수 있습니다.

>>> [i for i, j in zip(a, b) if i == j]
[5]

(순서-의미가 의미하는 동일한 크기의 목록에서만 작동합니다).


set.intersection ()을 사용하면 빠르고 읽기 쉽습니다 .

>>> set(a).intersection(b)
set([5])

Lutz의 솔루션을 보여주는 빠른 성능 테스트가 가장 좋습니다.

import time

def speed_test(func):
    def wrapper(*args, **kwargs):
        t1 = time.time()
        for x in xrange(5000):
            results = func(*args, **kwargs)
        t2 = time.time()
        print '%s took %0.3f ms' % (func.func_name, (t2-t1)*1000.0)
        return results
    return wrapper

@speed_test
def compare_bitwise(x, y):
    set_x = frozenset(x)
    set_y = frozenset(y)
    return set_x & set_y

@speed_test
def compare_listcomp(x, y):
    return [i for i, j in zip(x, y) if i == j]

@speed_test
def compare_intersect(x, y):
    return frozenset(x).intersection(y)

# Comparing short lists
a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]
compare_bitwise(a, b)
compare_listcomp(a, b)
compare_intersect(a, b)

# Comparing longer lists
import random
a = random.sample(xrange(100000), 10000)
b = random.sample(xrange(100000), 10000)
compare_bitwise(a, b)
compare_listcomp(a, b)
compare_intersect(a, b)

내 컴퓨터의 결과는 다음과 같습니다.

# Short list:
compare_bitwise took 10.145 ms
compare_listcomp took 11.157 ms
compare_intersect took 7.461 ms

# Long list:
compare_bitwise took 11203.709 ms
compare_listcomp took 17361.736 ms
compare_intersect took 6833.768 ms

분명히 인공 성능 테스트는 소금 한 알갱이로 수행해야하지만 set().intersection()답은 적어도 다른 솔루션 만큼 빠르며 가장 읽기 쉬운 것이기 때문에이 일반적인 문제에 대한 표준 솔루션이어야합니다.


나는 세트 기반 답변을 선호하지만 여하튼 작동하는 답변이 있습니다.

[x for x in a if x in b]

가장 쉬운 방법은 세트 를 사용하는 것입니다 .

>>> a = [1, 2, 3, 4, 5]
>>> b = [9, 8, 7, 6, 5]
>>> set(a) & set(b)
set([5])

빠른 방법 :

list(set(a).intersection(set(b)))

>>> s = ['a','b','c']   
>>> f = ['a','b','d','c']  
>>> ss= set(s)  
>>> fs =set(f)  
>>> print ss.intersection(fs)   
   **set(['a', 'c', 'b'])**  
>>> print ss.union(fs)        
   **set(['a', 'c', 'b', 'd'])**  
>>> print ss.union(fs)  - ss.intersection(fs)   
   **set(['d'])**

또한 공통 요소를 새 목록에 유지하여이를 시도 할 수 있습니다.

new_list = []
for element in a:
    if element in b:
        new_list.append(element)

중복을 원하십니까? 그렇지 않은 경우 대신 세트를 사용해야합니다.


>>> set([1, 2, 3, 4, 5]).intersection(set([9, 8, 7, 6, 5]))
set([5])

객체가 깊이 1을 가지며 순서를 유지하는 목록 1 (lst1) 및 목록 2 (lst2)에 대한 목록 등식을 확인하는 좀 더 기능적인 방법은 다음과 같습니다.

all(i == j for i, j in zip(lst1, lst2))   

당신이 사용할 수있는

def returnMatches(a,b):
       return list(set(a) & set(b))

a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]

lista =set(a)
listb =set(b)   
print listb.intersection(lista)   
returnMatches = set(['5']) #output 

print " ".join(str(return) for return in returnMatches ) # remove the set()   

 5        #final output 

itertools.product도 사용할 수 있습니다.

>>> common_elements=[]
>>> for i in list(itertools.product(a,b)):
...     if i[0] == i[1]:
...         common_elements.append(i[0])

당신이 사용할 수있는:

a = [1, 3, 4, 5, 9, 6, 7, 8]
b = [1, 7, 0, 9]
same_values = set(a) & set(b)
print same_values

산출:

set([1, 7, 9])

부울 값을 원하는 경우 :

>>> a = [1, 2, 3, 4, 5]
>>> b = [9, 8, 7, 6, 5]
>>> set(b) == set(a)  & set(b) and set(a) == set(a) & set(b)
False
>>> a = [3,1,2]
>>> b = [1,2,3]
>>> set(b) == set(a)  & set(b) and set(a) == set(a) & set(b)
True

다음 솔루션은 목록 항목의 순서에 관계없이 작동하며 두 목록의 길이가 다를 수도 있습니다.

import numpy as np
def getMatches(a, b):
    matches = []
    unique_a = np.unique(a)
    unique_b = np.unique(b)
    for a in unique_a:
        for b in unique_b:
            if a == b:
                matches.append(a)
    return matches
print(getMatches([1, 2, 3, 4, 5], [9, 8, 7, 6, 5, 9])) # displays [5]
print(getMatches([1, 2, 3], [3, 4, 5, 1])) # displays [1, 3]

__and__속성 방법을 사용하면 작동합니다.

>>> a = [1, 2, 3, 4, 5]
>>> b = [9, 8, 7, 6, 5]
>>> set(a).__and__(set(b))
set([5])

또는 단순히

>>> set([1, 2, 3, 4, 5]).__and__(set([9, 8, 7, 6, 5]))
set([5])
>>>    

you can | for set union and & for set intersection.
for example:

    set1={1,2,3}
    set2={3,4,5}
    print(set1&set2)
    output=3

    set1={1,2,3}
    set2={3,4,5}
    print(set1|set2)
    output=1,2,3,4,5

curly braces in the answer.

방금 다음을 사용했으며 나를 위해 일했습니다.

group1 = [1, 2, 3, 4, 5]
group2 = [9, 8, 7, 6, 5]

for k in group1:
    for v in group2:
        if k == v:
            print(k)

그러면 귀하의 경우 5를 인쇄합니다. 아마 현명한 성능은 아닙니다.

참고 URL : https://stackoverflow.com/questions/1388818/how-can-i-compare-two-lists-in-python-and-return-matches



반응형