python과 return matches의 두 목록을 비교하려면 어떻게 해야 합니까?
두 개의 목록을 가져와서 둘 다에 나타나는 값을 찾고 싶습니다.
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]
빠른 방법:
list(set(a).intersection(set(b)))
가장 쉬운 방법은 세트를 사용하는 것입니다.
>>> a = [1, 2, 3, 4, 5]
>>> b = [9, 8, 7, 6, 5]
>>> set(a) & set(b)
set([5])
>>> 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))
itertools.product도 사용할 수 있습니다.
>>> common_elements=[]
>>> for i in list(itertools.product(a,b)):
... if i[0] == i[1]:
... common_elements.append(i[0])
사용할 수 있습니다.
def returnMatches(a,b):
return list(set(a) & set(b))
다음을 사용할 수 있습니다.
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
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
사용.__and__
attribute 메서드도 기능합니다.
>>> 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])
>>>
다음 솔루션은 목록 항목의 순서에 관계없이 작동하며 두 목록의 길이를 다르게 지원합니다.
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]
공통값을 찾는 또 다른 방법:
a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]
matches = [i for i in a if i in b]
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가 인쇄됩니다.퍼포먼스가 뛰어나지 않은 것 같습니다.
이것은 특정 문자열 또는 출력을 반환할 수 있는 사용자를 위한 것입니다.다음 코드는 도움이 되기를 바랍니다.
lis =[]
#convert to list
a = list(data)
b = list(data)
def make_list():
c = "greater than"
d = "less_than"
e = "equal"
for first, first_te in zip(a, b):
if first < first_te:
lis.append(d)
elif first > first_te:
lis.append(c)
else:
lis.append(e)
return lis
make_list()
언급URL : https://stackoverflow.com/questions/1388818/how-can-i-compare-two-lists-in-python-and-return-matches
'itsource' 카테고리의 다른 글
Python 로케일 오류: 지원되지 않는 로케일 설정 (0) | 2022.10.26 |
---|---|
Java는 Currying을 지원합니까? (0) | 2022.10.26 |
키별로 JavaScript 개체 정렬 (0) | 2022.10.26 |
foreach 루프의 어레이 값 수정 (0) | 2022.10.25 |
인코딩 대신 이스케이프를 사용해야 하는 경우URI / 인코딩요구성분? (0) | 2022.10.25 |