두 개의 목록을 가져 와서 둘 다에 나타나는 값을 찾고 싶습니다.
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]
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(a).intersection(b)는 목록 이해보다 빠르거나 빠릅니다.
set(a) & set(b)?
set.intersection ()을 사용하면 빠르고 읽기 쉽습니다 .
>>> set(a).intersection(b)
set([5])
bool(set(a).intersection(b))대한 True나False
difference또는을 필요로하기 때문 union입니다.
.intersection()vs에 대한 성능 차이가 &있습니까?
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()답은 적어도 다른 솔루션 만큼 빠르며 가장 읽기 쉬운 것이기 때문에이 일반적인 문제에 대한 표준 솔루션이어야합니다.
set는 기존 항목에서 새로 만들면 list원본에서 아무것도 제거되지 않습니다 list. 목록 내에서 중복을 처리하는 특수 로직을 원한다면 중복 처리 방법에 대한 답변이 필요하기 때문에 새로운 질문을해야한다고 생각합니다.
>>> 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'])**
중복을 원하십니까? 그렇지 않은 경우 대신 세트를 사용해야합니다.
>>> set([1, 2, 3, 4, 5]).intersection(set([9, 8, 7, 6, 5]))
set([5])
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
당신이 사용할 수있는:
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]
np.intersect1d(list1, list2)
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.
&set 에서 연산자의 사용 은 이미 허용 된 답변으로 SilentGhost에 의해 답변되었습니다