2 টি তালিকার মধ্যে সাধারণ উপাদানগুলির তুলনা


143
def common_elements(list1, list2):
    """
    Return a list containing the elements which are in both list1 and list2

    >>> common_elements([1,2,3,4,5,6], [3,5,7,9])
    [3, 5]
    >>> common_elements(['this','this','n','that'],['this','not','that','that'])
    ['this', 'that']
    """
    for element in list1:
        if element in list2:
            return list(element)

এতক্ষণে পেয়েছি, তবে এটি কাজ করে বলে মনে হচ্ছে না!

কোন ধারনা?


1
হাই, আপনি কোডটি কীভাবে ব্যবহার করার পরিকল্পনা করছেন সে সম্পর্কে আপনি কিছু বিশদ যুক্ত করতে পারেন? যদি এটি কোনও অ্যাসাইনমেন্ট সম্পন্ন করতে হয় তবে এমন একটি সমাধান বেছে নেওয়া আরও ভাল হতে পারে যা "পাইথোনিক" উপায়ে প্রবেশ করে। তবে দক্ষতা যদি আপনার উদ্বেগ হয় তবে "পাইথোনিক" উপায়টি সবচেয়ে কার্যকর সমাধান হওয়ার সম্ভাবনা কম। এই বিবরণগুলির বিষয়ে আমাদের পরামর্শ দেওয়া আপনার সমস্যার সমাধানের লক্ষ্যে সমাধানগুলিতে সহায়তা করবে।
ম্যাট সি

উত্তর:


278
>>> list1 = [1,2,3,4,5,6]
>>> list2 = [3, 5, 7, 9]
>>> list(set(list1).intersection(list2))
[3, 5]

1
+1 তবে ব্যক্তিগতভাবে আমি হিমশীতল এটি অপরিবর্তনীয় হিসাবে ব্যবহার করতাম এবং তাই অভিধান কী ইত্যাদি হিসাবে ব্যবহার করা যেতে পারে
জেব্রাবক্স

19
এটি / অনন্য / সাধারণ উপাদানগুলি ফিরিয়ে দেবে, তবে বিদ্যমান কোনও পুনরাবৃত্তি উপাদান নয়।
ডোলোগান

@SilentGhost। দুটি তালিকা থেকে কীভাবে মিলে যাওয়া উপাদানের সংখ্যা পাবেন। এই ক্ষেত্রে এটি 2।
পোকা

@Poka LEN (তালিকা (সেট (তালিকা 1) .intersection (list2)))
Dharmanshu Kamra

2
অবগতির জন্য। এটি স্পষ্টতই তমসের প্রস্তাবিত সমাধানের চেয়ে দ্রুত, তবে ব্যবহারের ক্ষেত্রে আমি যখন এই পৃষ্ঠায় শেষ হচ্ছিলাম তখন পোস্ট ফিল্টারকারী উপাদানগুলির জন্য উপাদানগুলির মূল ক্রম সংরক্ষণ করা গুরুত্বপূর্ণ ছিল। এই পদ্ধতিটি অর্ডার হারায়, অন্যদিকে তালিকাটি বোঝার পদ্ধতিটি অর্ডার সংরক্ষণ করে। কারও যদি এটি বিবেচনা করা দরকার তবে গুরুত্বপূর্ণ। ধন্যবাদ।
15

41

আপনি সেটগুলিও ব্যবহার করতে পারেন এবং এক লাইনে সাধারণতা পেতে পারেন: একটি সেট থেকে পার্থক্য সম্বলিত সেটটি বিয়োগ করুন।

A = [1,2,3,4]
B = [2,4,7,8]
commonalities = set(A) - (set(A) - set(B))

4
এটি এটিকে দু'বার সেট করতে রূপান্তরিত করে, অযৌক্তিকভাবে অপচয়যোগ্য।
উইম

36

এস.মার্ক এবং সাইলেন্টগোস্টের প্রস্তাবিত সমাধানগুলি আপনাকে সাধারণত পাইথোনিক উপায়ে কীভাবে করা উচিত তা আপনাকে জানায় তবে আমি ভেবেছিলাম যে আপনার সমাধানটি কেন কাজ করে না তা জেনেও আপনি উপকৃত হতে পারেন। সমস্যাটি হ'ল দুটি তালিকার প্রথম সাধারণ উপাদানটি খুঁজে পাওয়ার সাথে সাথে আপনি কেবল সেই একক উপাদানটি ফিরে আসবেন। আপনার সমাধানটি একটি resultতালিকা তৈরি করে এবং সেই তালিকার সাধারণ উপাদানগুলি সংগ্রহ করে স্থির করা যেতে পারে :

def common_elements(list1, list2):
    result = []
    for element in list1:
        if element in list2:
            result.append(element)
    return result

তালিকা বোধগম্যতা ব্যবহার করে একটি আরও ছোট সংস্করণ:

def common_elements(list1, list2):
    return [element for element in list1 if element in list2]

তবে, যেমনটি আমি বলেছি এটি এটি করার একটি অত্যন্ত অযোগ্য পদ্ধতি Py পাইথনের অন্তর্নির্মিত সেট প্রকারগুলি অভ্যন্তরীণভাবে সিটিতে প্রয়োগ করা হওয়ায় আরও কার্যকর।


1
উভয় প্রস্তাবের জন্য দুর্দান্ত
dlewin

1
দ্রষ্টব্য: উপরের পদ্ধতিগুলি কেবল সমান আকারের তালিকার জন্য কাজ করবে। আপনি যেমন আমি যেমন অসম আকারের তালিকাগুলি নিয়ে কাজ করে চলেছি, তারপরে আপনাকে ফাংশনটি কল করার আগে লেন () এর উপর ভিত্তি করে ক্রমটি মূল্যায়ন করতে হবে: list1 = [2,2,2], list2 [2,3] -> [2,2,2] তালিকা 1 = [2,3], তালিকা 2 [2,2,2] -> [2]
redthumb

29

সেট ছেদ ব্যবহার, সেট (list1) এবং সেট (list2)

>>> def common_elements(list1, list2):
...     return list(set(list1) & set(list2))
...
>>>
>>> common_elements([1,2,3,4,5,6], [3,5,7,9])
[3, 5]
>>>
>>> common_elements(['this','this','n','that'],['this','not','that','that'])
['this', 'that']
>>>
>>>

নোট করুন যে ফলাফলের তালিকাটি মূল তালিকার সাথে বিভিন্ন ক্রম হতে পারে।


সাহায্যের জন্য ধন্যবাদ. আমি কোথায় ভুল হয়ে গিয়েছি এবং পরবর্তী সময়ে কী কাজ করব তা বুঝুন। :)
ড্যানিয়েল

5
দুর্দান্ত সমাধান এর সাথে অর্ডার সংরক্ষণেরও কি কোনও উপায় আছে?
তারশ্যাচ

14

আপনি একটি সাধারণ তালিকা অনুধাবন ব্যবহার করতে পারেন:

x=[1,2,3,4]
y=[3,4,5]
common = [i for i in x if i in y]
common: [3,4]

9

সেট হ'ল আমরা এটি সমাধান করতে পারি way

a = [3,2,4]
b = [2,3,5]
set(a)&set(b)
{2, 3}

9

তালিকা 1 = [1,2,3,4,5,6] তালিকা 2 = [3,5,7,9]

আমি জানি যে 3 টি উপায় এটি সমাধান করতে পারে, অবশ্যই আরও কিছু হতে পারে।

1-

common_elements = [e for e in list1 if e in list2]

2-

import numpy as np
common_elements = np.intersect1d(list1, list2)

3-

common_elements = set(list1).intersection(list2)

তৃতীয় উপায়টি দ্রুততম কারণ সেটগুলি হ্যাশ টেবিলগুলি ব্যবহার করে প্রয়োগ করা হয়।


8

পূর্ববর্তী সমস্ত উত্তর অনন্য সাধারণ উপাদানগুলি খুঁজে পেতে কাজ করে তবে তালিকাগুলিতে পুনরাবৃত্তি হওয়া আইটেমগুলির জন্য অ্যাকাউন্ট করতে ব্যর্থ হবে। যদি আপনি চান যে সাধারণ উপাদানগুলি তালিকায় সাধারণভাবে পাওয়া যায় একই সংখ্যায় উপস্থিত হয়, আপনি নীচের ওয়ান-লাইনার ব্যবহার করতে পারেন:

l2, common = l2[:], [ e for e in l1 if e in l2 and (l2.pop(l2.index(e)) or True)]

or Trueযদি আপনি মূল্যায়ন কোনো উপাদান আশা অংশ শুধুমাত্র প্রয়োজনীয় False


জট্টিল সমাধান,, সবচেয়ে পুঙ্খানুপুঙ্খ মনে হয় যদি একটু বাহুল্যবর্জিত
Hendeca

এই উত্তরটি নির্বাচন করা উচিত ছিল! আমি ধরে নিচ্ছি এটি অসম তালিকার জন্যও কাজ করে। এছাড়াও বেশিরভাগ সমাধানগুলি ব্যবহার করে setযা স্থিতিশীল নয় (ওরফে অর্ডারটি হারিয়ে গেছে)।
লাইফব্লেন্স

7

আমি প্রতিটি উত্তর বর্ণিত পদ্ধতি প্রতিটি তুলনা। এই বাস্তবায়নের জন্য আমি এই মুহুর্তে অজগরটি 3.6.3 ব্যবহার করি। এই কোডটি আমি ব্যবহার করেছি:

import time
import random
from decimal import Decimal


def method1():
    common_elements = [x for x in li1_temp if x in li2_temp]
     print(len(common_elements))


def method2():
    common_elements = (x for x in li1_temp if x in li2_temp)
    print(len(list(common_elements)))


def method3():
    common_elements = set(li1_temp) & set(li2_temp)
    print(len(common_elements))


def method4():
    common_elements = set(li1_temp).intersection(li2_temp)
    print(len(common_elements))


if __name__ == "__main__":
    li1 = []
    li2 = []
    for i in range(100000):
        li1.append(random.randint(0, 10000))
        li2.append(random.randint(0, 10000))

    li1_temp = list(set(li1))
    li2_temp = list(set(li2))

    methods = [method1, method2, method3, method4]
    for m in methods:
        start = time.perf_counter()
        m()
        end = time.perf_counter()
        print(Decimal((end - start)))

আপনি যদি এই কোডটি চালান তবে আপনি দেখতে পাচ্ছেন যে আপনি যদি তালিকা বা জেনারেটর ব্যবহার করেন (আপনি যদি জেনারেটরের উপরে পুনরাবৃত্তি করেন, কেবল এটি ব্যবহার করেন না I আমি যখন জেনারেটরকে তার দৈর্ঘ্য মুদ্রণ করতে বাধ্য করতাম) তখন আপনি প্রায় একই কর্মক্ষমতা পান। আপনি যদি সেটটি ব্যবহার করেন তবে আপনি আরও ভাল পারফরম্যান্স পাবেন। এছাড়াও আপনি ছেদ পদ্ধতিটি ব্যবহার করলে আপনি কিছুটা আরও ভাল পারফরম্যান্স পাবেন। আমার কম্পিউটারে প্রতিটি পদ্ধতির ফলাফলকে নমুনা তালিকাভুক্ত করা হয়েছে:

  1. পদ্ধতি 1: 0.815067399999999996619413478649221360683441
  2. পদ্ধতি 2: 0.83295450000001531148541289439890533685684
  3. পদ্ধতি 3: 0.00165470000000089414697868051007390022277
  4. পদ্ধতি 4: 0.0010262999999999244948867271887138485908508

5

এটি আমার প্রস্তাব আমি লুপের চেয়ে সেটগুলির সাথে এটি আরও সহজ মনে করি

def unique_common_items(list1, list2):
   # Produce the set of *unique* common items in two lists.
   return list(set(list1) & set(list2))

2

কেন ব্যবহার list comprehensionকরবেন না ?

অর্ধ লাইন সমাধান:

common_elements = [x for x in list1 if x in list2]

0

1) মেথড 1 সংরক্ষণের তালিকা 1 হ'ল অভিধান এবং তারপরে তালিকার প্রতিটি এলিম পুনরাবৃত্তি করুন

def findarrayhash(a,b):
    h1={k:1 for k in a}
    for val in b:
        if val in h1:
            print("common found",val)
            del h1[val]
        else:
            print("different found",val)
    for key in h1.iterkeys():
        print ("different found",key)

সাধারণ এবং বিভিন্ন উপাদান সন্ধান করা:

2) পদ্ধতি 2 সেট ব্যবহার করে

def findarrayset(a,b):
    common = set(a)&set(b)
    diff=set(a)^set(b)
    print list(common)
    print list(diff) 

-1

একটি জেনারেটর ব্যবহার করুন:

common = (x for x in list1 if x in list2)

এখানে সুবিধাটি হ'ল বিশাল তালিকা বা অন্যান্য বিশাল পুনরাবৃত্তিগুলি ব্যবহার করার পরেও এটি স্থির সময়ে (প্রায় তাত্ক্ষণিক) ফিরে আসবে।

উদাহরণ স্বরূপ,

list1 =  list(range(0,10000000))
list2=list(range(1000,20000000))
common = (x for x in list1 if x in list2)

এখানে অন্যান্য সমস্ত উত্তর তালিকা 1 এবং তালিকা 2 এর জন্য এই মানগুলির সাথে খুব দীর্ঘ সময় নিবে।

তারপরে আপনি উত্তরটি পুনরাবৃত্তি করতে পারেন

for i in common: print(i)

অথবা এর সাথে তালিকায় রূপান্তর করুন

list(i)

এটি কোনও উত্তর দেয় না। ফলাফল সাধারণ উপাদানগুলির তালিকার চেয়ে জেনারেটর।
josiekre

1
সঠিক, এটি একটি জেনারেটর তৈরি করে, যা একটি উত্তর। প্রশ্নটি হ'ল একরকম 2 তালিকার সাধারণ উপাদানগুলি পেতে, যা এই জেনারেটরটি করে। কেবলমাত্র তাই মত জেনারেটরের পুনরুক্তি: for i in common: print(i)। জেনারেটরগুলি পুনরাবৃত্ত হয় যা তালিকার মতো অন্য পুনরাবৃত্তের জায়গায় ঘন ঘন ব্যবহৃত হয় used
কাপলিনেটর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.