मैं दो सूची लेना चाहता हूं और उन मूल्यों को खोजना चाहता हूं जो दोनों में दिखाई देते हैं।
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()
बनाम के लिए कोई प्रदर्शन अंतर है &
?
लुट्ज़ का समाधान दिखाने वाला एक त्वरित प्रदर्शन परीक्षण सबसे अच्छा है:
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
। यदि आप एक सूची के भीतर डुप्लिकेट को संभालने के लिए विशेष तर्क चाहते हैं, तो मुझे लगता है कि आपको एक नया प्रश्न पूछना होगा क्योंकि उत्तर के लिए विशिष्ट होना चाहिए कि आप डुप्लिकेट को कैसे संभालना चाहते हैं।
मैं सेट आधारित उत्तरों को पसंद करता हूं, लेकिन यहां एक है जो वैसे भी काम करता है
[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'])**
क्या आप डुप्लिकेट चाहते हैं? यदि नहीं तो आपको इसके बजाय सेट का उपयोग करना चाहिए:
>>> set([1, 2, 3, 4, 5]).intersection(set([9, 8, 7, 6, 5]))
set([5])
सूची 1 (lst1) और सूची 2 (lst2) के लिए सूची समानता की जांच करने के लिए एक और थोड़ा कार्यात्मक तरीका जहां वस्तुओं की गहराई एक है और जो क्रम रखता है वह है:
all(i == j for i, j in zip(lst1, lst2))
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.
&
सेट पर ऑपरेटर का उपयोग पहले से ही स्वीकृत जवाब में साइलेंटगॉस्ट द्वारा उत्तर दिया गया है