두 개의 목록을 가져 와서 둘 다에 나타나는 값을 찾고 싶습니다.
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]
(순서-의미가 의미하는 동일한 크기의 목록에서만 작동합니다).
답변
답변
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'])**