অজগর এবং রিটার্ন ম্যাচে আমি কীভাবে দুটি তালিকার তুলনা করতে পারি


378

আমি দুটি তালিকা নিতে এবং উভয়ের মধ্যে প্রদর্শিত মানগুলি খুঁজতে চাই।

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

returnMatches(a, b)

[5]উদাহরণস্বরূপ, ফিরে আসবে ।


4
নীচের সমস্ত উত্তর আমার কাছে ভুল বলে মনে হচ্ছে। উভয় তালিকায় যদি কোনও সংখ্যার পুনরাবৃত্তি ঘটে, তবে কী হবে তা অবশ্যই আপনি জানতে চান ((), উভয় তালিকায় দু'বার '5' রয়েছে বলে সেটগুলি ব্যবহার করে যে কোনও সমাধান সঙ্গে সঙ্গে সমস্ত পুনরাবৃত্তি আইটেম সরিয়ে ফেলবে এবং আপনি হারাবেন যে তথ্য।
এমএইচ

উত্তর:


485

সবচেয়ে দক্ষ এক নয়, তবে এটি করার সবচেয়ে সুস্পষ্ট উপায় হ'ল:

>>> 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]

(কেবলমাত্র সমান আকারের তালিকার জন্য কাজ করে, যা অর্ডার-তাত্পর্যটি বোঝায়)।


15
সাবধানতা একটি নোট, তালিকা ধী হয় না অগত্যা দ্রুত বিকল্প। বৃহত্তর সেটের জন্য (যেখানে পারফরম্যান্স বেশিরভাগ ক্ষেত্রে গুরুত্বপূর্ণ) বিটওয়াইজ তুলনা ( &) বা set(a).intersection(b)তালিকার বোঝাপড়ার চেয়ে দ্রুত বা দ্রুত হবে।
জোশমেকার

24
সাবধানতার আরেকটি নোট: তালিকা অনুধাবন একই মানগুলিতে উভয়ের মধ্যে উপস্থিত হওয়া মানগুলি খুঁজে পায় (এটিই হ'ল সাইলেন্টগোস্ট "অর্ডারটি উল্লেখযোগ্য")। সেট ছেদ সমাধানগুলি ডিফলার পজিশনে মিলও খুঁজে পাবে। এগুলি 2 একেবারে পৃথক প্রশ্নের উত্তর ... (অপের প্রশ্নটি এটি জিজ্ঞাসা করা অস্পষ্ট)
ড্রেভিকো

আপনার তালিকাগুলি যদি তালিকার তালিকাগুলি হয় তবে এটি কী করে করবেন যেমন a = [[0,0], [1,0]] এবং বি = [[2,3], [0,0]]
শ্নেমে

3
প্রথম উদাহরণটির সময় জটিলতাটি কী হবে set(a) & set(b)?
অ্যাডজুনেক্টপ্রসফেসরফ্যালকন

দ্রষ্টব্য, উভয় সেট ফাঁকা থাকলে এবং আপনি যদি পাসের তুলনা আশা করেন তবে এটি কাজ করে না। সুতরাং "(সেট (ক) এবং সেট (খ) এবং" (এ এবং বি নয়) "এ পরিবর্তন করুন
নীল ম্যাকগিল

395

Set.intersication () ব্যবহার করুন , এটি দ্রুত এবং পঠনযোগ্য।

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

28
এই উত্তরের ভাল অ্যালগরিদমিক পারফরম্যান্স রয়েছে, কারণ তালিকার মধ্যে কেবল একটির (সংক্ষিপ্ততর পছন্দ করা উচিত) দ্রুত দেখার জন্য একটি সেটে রূপান্তরিত করা হয়েছে এবং অন্য তালিকাটি সেটগুলিতে তার আইটেমগুলি সন্ধান করে বিভ্রান্ত হয়েছে।
u0b34a0f6ae

18
bool(set(a).intersection(b))জন্য TrueবাFalse
অক্ষয়

6
এই উত্তরটি আরও নমনীয় এবং পঠনযোগ্য, যেহেতু মানুষের প্রয়োজন হতে পারে differenceবা union
শিহে ঝাং

যদি তালিকার উপাদান হিসাবে আমার কাছে অবজেক্ট থাকে এবং কেবলমাত্র আংশিক মিলগুলি চায়, তবে এটির সাথে ম্যাচিং অবজেক্ট হিসাবে বিবেচিত হওয়ার জন্য কেবল কয়েকটি বৈশিষ্ট্যের সাথে মিল রাখতে হবে?
সিজিএফএক্স

.intersection()বনাম জন্য কোনও পারফরম্যান্স পার্থক্য আছে &?
ব্র্যান্ডব্যাঙ্কস

106

লুটসের সমাধানটি দেখানো একটি দ্রুত পারফরম্যান্স পরীক্ষা সেরা:

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। যদি আপনি কোনও তালিকার মধ্যে সদৃশগুলি হ্যান্ডেল করার জন্য বিশেষ যুক্তি চান তবে আমার মনে হয় আপনাকে একটি নতুন প্রশ্ন জিজ্ঞাসা করতে হবে কারণ ডুপ্লিকেটগুলি কীভাবে পরিচালনা করতে চান তার উত্তরটি নির্দিষ্ট হওয়া দরকার।
জোশমেকার

67

আমি সেট ভিত্তিক উত্তরগুলি পছন্দ করি তবে এখানে যে কোনওভাবেই কাজ করে

[x for x in a if x in b]



14
>>> 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'])**

1
গৃহীত উত্তর তালিকার জন্য তালিকার কাজ করে না। এই এক না।
অ্যান্টনি

12

এছাড়াও সাধারণ উপাদানগুলিকে নতুন তালিকায় রেখে আপনি এটি ব্যবহার করতে পারেন।

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

5

আপনি কি নকল চান? যদি না হয় তবে এর পরিবর্তে আপনার সেটগুলি ব্যবহার করা উচিত:


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

আপনি যদি সত্যিই তালিকাগুলি চান, java2s.com/Code/Python/List/Functiontointersecttwolists.htm >>> ছেদ করুন ([1, 2, 3, 4, 5], [9, 8, 7, 6, 5]) [5 ]
টিমোথী প্রটলে

দস্তাবেজের মতে - ... আরও পাঠযোগ্য সেট ('এবিসি') এর পক্ষে চৌর্যবৃত্তি ('সিবিএস') এর মতো সেট ('এবিসি') এবং 'সিবিএস' এর মতো ত্রুটি-প্রবণ নির্মাণকে অগ্রাহ্য করে। - docs.python.org/library/sets.html
অ্যারন নিউটন

5

তালিকা 1 (lst1) এবং তালিকা 2 (lst2) এর জন্য তালিকার সমতা চেক করার আরেকটি আরও কার্যকরী উপায় যেখানে বস্তুর গভীরতা রয়েছে এবং যেটি অর্ডার বজায় রাখে তা হল:

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

4
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 

যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে।
ডোনাল্ড হাঁস

4

Itertools.prodct খুব ব্যবহার করতে পারেন।

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


3

তুমি ব্যবহার করতে পার:

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])

4
এটি কীভাবে 6+ বছর পূর্বে গৃহীত উত্তরের চেয়ে আলাদা?
tmdavison

1
আচ্ছা, আমি আউটপুট সহ সম্পূর্ণ বিশদটি লিখেছিলাম এবং প্রাথমিক অজগরটির পক্ষে ভাল
আদনান গাফফার

2

আপনি যদি বুলিয়ান মান চান:

>>> 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

1

নিম্নলিখিত সমাধান তালিকার আইটেমগুলির যে কোনও ক্রমের জন্য কাজ করে এবং উভয় তালিকাকে পৃথক দৈর্ঘ্য হিসাবে সমর্থন করে।

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]

1
নম্পি এর জন্য একটি নির্দিষ্ট ফাংশন রয়েছে:np.intersect1d(list1, list2)
অবচার্ডন

0

__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])
>>>    

0
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.

4
প্রশ্নটি তালিকার জন্য ছিল এবং কোনও সেট নেই। &সেটটিতে অপারেটরের ব্যবহার ইতিমধ্যে সাইলেন্টগোস্টের গৃহীত উত্তরে উত্তর
ডিওয়াইন্ডার

0

আমি কেবল নিম্নলিখিতটি ব্যবহার করেছি এবং এটি আমার পক্ষে কাজ করেছে:

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 মুদ্রণ করবে। সম্ভবত দুর্দান্ত পারফরম্যান্স বুদ্ধিমান না হলেও।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.