তালিকার ছেদটি কীভাবে সন্ধান করবেন?


203
a = [1,2,3,4,5]
b = [1,3,5,6]
c = a and b
print c

আসল আউটপুট: [1,3,5,6] প্রত্যাশিত আউটপুট:[1,3,5]

আমরা কীভাবে দুটি তালিকার বুলেট এবং অপারেশন (তালিকার ছেদ) অর্জন করতে পারি?


6
এখানে সমস্যাটি হ'ল ডকুমেন্টেশনেরa and b নীচের বিবৃতিটির মতো এটির উল্লেখ রয়েছে: " এক্সপ্রেশনটি x and yপ্রথমে মূল্যায়ন করে x; যদি xএটি মিথ্যা হয় তবে এর মান ফিরে পাওয়া যায়; অন্যথায়, yমূল্যায়ন করা হয় এবং ফলস্বরূপ মানটি ফিরে আসে। "
টেডেক

উত্তর:


347

যদি অর্ডারটি গুরুত্বপূর্ণ না হয় এবং আপনাকে সদৃশগুলি নিয়ে চিন্তা করার দরকার নেই তবে আপনি সেট ছেদটি ব্যবহার করতে পারেন:

>>> a = [1,2,3,4,5]
>>> b = [1,3,5,6]
>>> list(set(a) & set(b))
[1, 3, 5]

9
কি যদি a = [1,1,2,3,4,5]এবং b = [1,1,3,5,6]তারপর ছেদ হয় [1,1,3,5]কিন্তু উপরের পদ্ধতি দ্বারা এটি পরিণাম ডেকে আনবে শুধুমাত্র একটি 1অর্থাত [1, 3, 5]কি লিখতে উপায় এটা তাহলে আছে কি করতে হবে?
নীতীশ কুমার পাল

6
@নিটিশকুমারপাল intersectionসাধারণত ভিত্তিক সেট করা বোঝা যায় । আপনি কিছুটা ভিন্ন প্রাণীর সন্ধান করছেন - এবং প্রতিটি তালিকা বাছাই করে ফলাফলগুলি মার্জ করে - এবং মার্জগুলিতে ডুপগুলি রেখে আপনার ম্যানুয়ালি এটি করতে হবে।
জাভাদবা

1
@ মার্কবায়ার্স এটির সদৃশ হবে না
জাভাদবা

84

তালিকা বোধগম্যতা ব্যবহার করা আমার পক্ষে বেশ সুস্পষ্ট। পারফরম্যান্স সম্পর্কে নিশ্চিত নয়, তবে কমপক্ষে জিনিসগুলি তালিকাগুলিতে থাকবে।

[x for x in a if x in b]

অথবা "সমস্ত এক্স মান যে A তে থাকে, যদি এক্স মান বি হয়"।


1
এটি সর্বাধিক পাইথোনিক মনে হয় যা শৃঙ্খলা রাখে। নিশ্চিত না কেন এটি উচ্চতর নয়! দুর্দান্ত সমাধানের জন্য THX!
বিল ডি

15
এটি একটি ও (এন ^ 2) সমাধান, যেখানে উপরের সমাধানগুলি
হ'ল

3
@nareddyt - bএকটি সেট করুন এবং আপনার ও (এন) থাকবে
jcchuks

2
@jcchuks এই সমাধানটির সুবিধা হ'ল যদি আপনাকে সদৃশগুলি ধরে রাখতে হয়। আপনি যদি স্বতন্ত্রতার বিষয়ে নিশ্চিত হতে পারেন তবে একটি ও (এন) সেট সমাধান আরও ভাল। তবে, যদি সদৃশগুলি সম্ভব না হয়, তবে ওপি কেন এমনকি তালিকা শুরু করার বিষয়ে কথা বলছে? তালিকার ছেদটি ধারণা একটি গাণিতিক অযৌক্তিকতা
ডেমোঙ্গোলেম

63

আপনি যদি দুটি তালিকার বৃহতকে একটি সেটে রূপান্তর করেন তবে আপনি যে কোনও পুনরাবৃত্তিযোগ্য ব্যবহার করে সেই সেটটির ছেদটি পেতে পারেন intersection():

a = [1,2,3,4,5]
b = [1,3,5,6]
set(a).intersection(b)

9
এটি কি আলাদাlist(set(a) & set(b))
ব্যবহারকারীর 1767754

3
কোন তালিকা কেন সেট (রূপান্তরিত এন! = মি) রূপান্তরিত হয় তা বিবেচনা করে? কেবলমাত্র একজনকে সেট করতে রূপান্তর করার সুবিধা কী?
পিট

1
দেখে মনে হচ্ছে এটি আরও দ্রুত হবে
নাথান

29

বৃহত্তর থেকে একটি সেট তৈরি করুন:

_auxset = set(a)

তারপর,

c = [x for x in b if x in _auxset]

আপনি যা চান তা করবে ( bআদেশের সংরক্ষণ করে, এটি নয় a- অগত্যা উভয়ই সংরক্ষণ করতে পারে না ) এবং এটি দ্রুত করুন । ( if x in aতালিকার শর্ত হিসাবে পরিস্থিতি ব্যবহার করাও কাজ করবে এবং নির্মাণের প্রয়োজন এড়াবে _auxset, তবে দুর্ভাগ্যক্রমে যথেষ্ট দৈর্ঘ্যের তালিকাগুলির জন্য এটি অনেক ধীর হবে)।

আপনি যদি ফলাফলটি বাছাই করতে চান তবে উভয় তালিকার ক্রম সংরক্ষণের পরিবর্তে, আরও সুন্দর উপায় হতে পারে:

c = sorted(set(a).intersection(b))

এটি গ্রহণযোগ্য উত্তরের চেয়ে প্রায় ধীরে ধীরে তবে ডুপ্লিকেটগুলি নষ্ট না হওয়ার সুবিধা রয়েছে।
ট্রিপলি

18

এখানে কিছু পাইথন 2 / পাইথন 3 কোড রয়েছে যা দুটি তালিকার ছেদ খুঁজে পাওয়ার তালিকার ভিত্তিক এবং সেট-ভিত্তিক পদ্ধতির জন্য সময় সংক্রান্ত তথ্য উত্পন্ন করে।

খাঁটি তালিকা বোঝার অ্যালগরিদমগুলি inহ'ল (এন ^ 2), যেহেতু একটি তালিকার একটি লিনিয়ার অনুসন্ধান। সেট-ভিত্তিক অ্যালগরিদমগুলি হ'ল (এন), যেহেতু সেট অনুসন্ধান ও (1), এবং সেট তৈরি হ'ল ও (এন) (এবং একটি সেটকে তালিকায় রূপান্তর করাও ও (এন))। সুতরাং পর্যাপ্ত পরিমাণে বড় এন-এর জন্য সেট-ভিত্তিক অ্যালগরিদমগুলি দ্রুততর হয় তবে ছোট এন এর জন্য সেট তৈরির ওভারহেডগুলি খাঁটি তালিকা কম্প অ্যালগরিদমের চেয়ে ধীর করে তোলে।

#!/usr/bin/env python

''' Time list- vs set-based list intersection
    See http://stackoverflow.com/q/3697432/4014959
    Written by PM 2Ring 2015.10.16
'''

from __future__ import print_function, division
from timeit import Timer

setup = 'from __main__ import a, b'
cmd_lista = '[u for u in a if u in b]'
cmd_listb = '[u for u in b if u in a]'

cmd_lcsa = 'sa=set(a);[u for u in b if u in sa]'

cmd_seta = 'list(set(a).intersection(b))'
cmd_setb = 'list(set(b).intersection(a))'

reps = 3
loops = 50000

def do_timing(heading, cmd, setup):
    t = Timer(cmd, setup)
    r = t.repeat(reps, loops)
    r.sort()
    print(heading, r)
    return r[0]

m = 10
nums = list(range(6 * m))

for n in range(1, m + 1):
    a = nums[:6*n:2]
    b = nums[:6*n:3]
    print('\nn =', n, len(a), len(b))
    #print('\nn = %d\n%s %d\n%s %d' % (n, a, len(a), b, len(b)))
    la = do_timing('lista', cmd_lista, setup) 
    lb = do_timing('listb', cmd_listb, setup) 
    lc = do_timing('lcsa ', cmd_lcsa, setup)
    sa = do_timing('seta ', cmd_seta, setup)
    sb = do_timing('setb ', cmd_setb, setup)
    print(la/sa, lb/sa, lc/sa, la/sb, lb/sb, lc/sb)

আউটপুট

n = 1 3 2
lista [0.082171916961669922, 0.082588911056518555, 0.0898590087890625]
listb [0.069530963897705078, 0.070394992828369141, 0.075379848480224609]
lcsa  [0.11858987808227539, 0.1188349723815918, 0.12825107574462891]
seta  [0.26900982856750488, 0.26902294158935547, 0.27298116683959961]
setb  [0.27218389511108398, 0.27459001541137695, 0.34307217597961426]
0.305460649521 0.258469975867 0.440838458259 0.301898526833 0.255455833892 0.435697630214

n = 2 6 4
lista [0.15915989875793457, 0.16000485420227051, 0.16551494598388672]
listb [0.13000702857971191, 0.13060092926025391, 0.13543915748596191]
lcsa  [0.18650484085083008, 0.18742108345031738, 0.19513416290283203]
seta  [0.33592700958251953, 0.34001994132995605, 0.34146714210510254]
setb  [0.29436492919921875, 0.2953648567199707, 0.30039691925048828]
0.473793098554 0.387009751735 0.555194537893 0.540689066428 0.441652573672 0.633583767462

n = 3 9 6
lista [0.27657914161682129, 0.28098297119140625, 0.28311991691589355]
listb [0.21585917472839355, 0.21679902076721191, 0.22272896766662598]
lcsa  [0.22559309005737305, 0.2271728515625, 0.2323150634765625]
seta  [0.36382699012756348, 0.36453008651733398, 0.36750602722167969]
setb  [0.34979605674743652, 0.35533690452575684, 0.36164689064025879]
0.760194128313 0.59330170819 0.62005595016 0.790686848184 0.61710008036 0.644927481902

n = 4 12 8
lista [0.39616990089416504, 0.39746403694152832, 0.41129183769226074]
listb [0.33485794067382812, 0.33914685249328613, 0.37850618362426758]
lcsa  [0.27405810356140137, 0.2745978832244873, 0.28249192237854004]
seta  [0.39211201667785645, 0.39234519004821777, 0.39317893981933594]
setb  [0.36988520622253418, 0.37011313438415527, 0.37571001052856445]
1.01034878821 0.85398540833 0.698928091731 1.07106176249 0.905302334456 0.740927452493

n = 5 15 10
lista [0.56792402267456055, 0.57422614097595215, 0.57740211486816406]
listb [0.47309303283691406, 0.47619009017944336, 0.47628307342529297]
lcsa  [0.32805585861206055, 0.32813096046447754, 0.3349759578704834]
seta  [0.40036201477050781, 0.40322518348693848, 0.40548801422119141]
setb  [0.39103078842163086, 0.39722800254821777, 0.43811702728271484]
1.41852623806 1.18166313332 0.819398061028 1.45237674242 1.20986133789 0.838951479847

n = 6 18 12
lista [0.77897095680236816, 0.78187918663024902, 0.78467702865600586]
listb [0.629547119140625, 0.63210701942443848, 0.63321495056152344]
lcsa  [0.36563992500305176, 0.36638498306274414, 0.38175487518310547]
seta  [0.46695613861083984, 0.46992206573486328, 0.47583580017089844]
setb  [0.47616910934448242, 0.47661614418029785, 0.4850609302520752]
1.66818870637 1.34819326075 0.783028414812 1.63591241329 1.32210827369 0.767878297495

n = 7 21 14
lista [0.9703209400177002, 0.9734041690826416, 1.0182771682739258]
listb [0.82394003868103027, 0.82625699043273926, 0.82796716690063477]
lcsa  [0.40975093841552734, 0.41210508346557617, 0.42286920547485352]
seta  [0.5086359977722168, 0.50968098640441895, 0.51014018058776855]
setb  [0.48688101768493652, 0.4879908561706543, 0.49204087257385254]
1.90769222837 1.61990115188 0.805587768483 1.99293236904 1.69228211566 0.841583309951

n = 8 24 16
lista [1.204819917678833, 1.2206029891967773, 1.258256196975708]
listb [1.014998197555542, 1.0206191539764404, 1.0343101024627686]
lcsa  [0.50966787338256836, 0.51018595695495605, 0.51319599151611328]
seta  [0.50310111045837402, 0.50556015968322754, 0.51335406303405762]
setb  [0.51472997665405273, 0.51948785781860352, 0.52113485336303711]
2.39478683834 2.01748351664 1.01305257092 2.34068341135 1.97190418975 0.990165516871

n = 9 27 18
lista [1.511646032333374, 1.5133969783782959, 1.5639569759368896]
listb [1.2461750507354736, 1.254518985748291, 1.2613379955291748]
lcsa  [0.5565330982208252, 0.56119203567504883, 0.56451296806335449]
seta  [0.5966339111328125, 0.60275578498840332, 0.64791703224182129]
setb  [0.54694414138793945, 0.5508568286895752, 0.55375313758850098]
2.53362406013 2.08867620074 0.932788243907 2.76380331728 2.27843203069 1.01753187594

n = 10 30 20
lista [1.7777848243713379, 2.1453688144683838, 2.4085969924926758]
listb [1.5070111751556396, 1.5202279090881348, 1.5779800415039062]
lcsa  [0.5954139232635498, 0.59703707695007324, 0.60746097564697266]
seta  [0.61563014984130859, 0.62125110626220703, 0.62354087829589844]
setb  [0.56723213195800781, 0.57257509231567383, 0.57460403442382812]
2.88774814689 2.44791645689 0.967161734066 3.13413984189 2.6567803378 1.04968299523

লিনাক্সের ডেবিয়ান স্বাদে (ফায়ারফক্স ব্যাকগ্রাউন্ডে চলমান রয়েছে) 2 জিএম র‌্যামের 2 জিএম র‌্যামের সাথে 2 জিএইচজেড সিঙ্গল কোর মেশিন ব্যবহার করে উত্পন্ন হয়েছে।

এই পরিসংখ্যানগুলি কেবল একটি মোটামুটি গাইড, যেহেতু উভয় উত্স তালিকায় থাকা উপাদানগুলির অনুপাতের দ্বারা বিভিন্ন অ্যালগরিদমের আসল গতি আলাদাভাবে প্রভাবিত হয়।


11
a = [1,2,3,4,5]
b = [1,3,5,6]
c = list(set(a).intersection(set(b)))

স্বপ্নের মতো কাজ করা উচিত। এবং, আপনি যদি পারেন তবে এই জাতীয় পরিবর্তনগুলি এড়াতে তালিকার পরিবর্তে সেটগুলি ব্যবহার করুন!


যদি এবং বি বড় হয় তবে এটি অন্যান্য উত্তরের চেয়ে দ্রুত
জাভদ্ব্বা

5

একটি কার্যকরী উপায় filterএবং lambdaঅপারেটর ব্যবহার করে অর্জন করা যেতে পারে ।

list1 = [1,2,3,4,5,6]

list2 = [2,4,6,9,10]

>>> list(filter(lambda x:x in list1, list2))

[2, 4, 6]

সম্পাদনা: এটি এক্স ফিল্টার করে যা তালিকা 1 এবং তালিকার উভয় ক্ষেত্রেই বিদ্যমান রয়েছে, সেট পার্থক্যটি ব্যবহার করেও অর্জন করা যেতে পারে:

>>> list(filter(lambda x:x not in list1, list2))
[9,10]

সম্পাদনা 2: পাইথন 3 filterএকটি ফিল্টার অবজেক্ট listফিরিয়ে দেয়, আউটপুট তালিকার সাথে এটি আবদ্ধ করে ।


এই কোডটি কীভাবে কাজ করে তা ব্যাখ্যা করার জন্য দয়া করে সম্পাদনা লিঙ্কটি ব্যবহার করুন এবং কেবল কোডটি দেবেন না, কারণ ব্যাখ্যাটি ভবিষ্যতের পাঠকদের সহায়তা করার সম্ভাবনা বেশি। আরও দেখুন কিভাবে উত্তর দিতেউত্স
জেড ফক্স

1
পাইথন 3 এর সাথে এটি একটি ফিল্টার অবজেক্ট দেয়। list(filter(lambda x:x in list1, list2))এটিকে একটি তালিকা হিসাবে পেতে আপনাকে বলতে হবে।
অ্যাড্রিয়ান ডাব্লু

1

এটি উদাহরণস্বরূপ যখন আপনার প্রয়োজন হয় ফলাফলের প্রতিটি উপাদানটি উভয় অ্যারেতে প্রদর্শিত যতবার প্রদর্শিত হয়।

def intersection(nums1, nums2):
    #example:
    #nums1 = [1,2,2,1]
    #nums2 = [2,2]
    #output = [2,2]
    #find first 2 and remove from target, continue iterating

    target, iterate = [nums1, nums2] if len(nums2) >= len(nums1) else [nums2, nums1] #iterate will look into target

    if len(target) == 0:
            return []

    i = 0
    store = []
    while i < len(iterate):

         element = iterate[i]

         if element in target:
               store.append(element)
               target.remove(element)

         i += 1


    return store

1

এটি দেরিতে হতে পারে তবে আমি কেবল ভেবেছিলাম যে ম্যানুয়ালি এটি করার দরকার আছে সেই ক্ষেত্রেই আমার ভাগ করে নেওয়া উচিত (কাজ দেখান - হাহা) বা যখন আপনার যখন সমস্ত উপাদানগুলি সম্ভব ততবার দেখাবার প্রয়োজন হয় বা যখন আপনাকে এটি অনন্য হওয়ার দরকার হয় ।

দয়া করে নোট করুন যে পরীক্ষাগুলিও এর জন্য লেখা হয়েছিল।



    from nose.tools import assert_equal

    '''
    Given two lists, print out the list of overlapping elements
    '''

    def overlap(l_a, l_b):
        '''
        compare the two lists l_a and l_b and return the overlapping
        elements (intersecting) between the two
        '''

        #edge case is when they are the same lists
        if l_a == l_b:
            return [] #no overlapping elements

        output = []

        if len(l_a) == len(l_b):
            for i in range(l_a): #same length so either one applies
                if l_a[i] in l_b:
                    output.append(l_a[i])

            #found all by now
            #return output #if repetition does not matter
            return list(set(output))

        else:
            #find the smallest and largest lists and go with that
            sm = l_a if len(l_a)  len(l_b) else l_b

            for i in range(len(sm)):
                if sm[i] in lg:
                    output.append(sm[i])

            #return output #if repetition does not matter
            return list(set(output))

    ## Test the Above Implementation

    a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
    b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
    exp = [1, 2, 3, 5, 8, 13]

    c = [4, 4, 5, 6]
    d = [5, 7, 4, 8 ,6 ] #assuming it is not ordered
    exp2 = [4, 5, 6]

    class TestOverlap(object):

        def test(self, sol):
            t = sol(a, b)
            assert_equal(t, exp)
            print('Comparing the two lists produces')
            print(t)

            t = sol(c, d)
            assert_equal(t, exp2)
            print('Comparing the two lists produces')
            print(t)

            print('All Tests Passed!!')

    t = TestOverlap()
    t.test(overlap)

0

যদি, বুলিয়ান অ্যান্ড দ্বারা, আপনার বোঝানো আইটেমগুলি যা উভয় তালিকায় প্রদর্শিত হয়, যেমন ছেদ, তখন আপনার পাইথন setএবং frozensetপ্রকারের দিকে নজর দেওয়া উচিত ।


0

আপনি একটি কাউন্টার ব্যবহার করতে পারেন! এটি অর্ডার সংরক্ষণ করে না, তবে এটি সদৃশগুলি বিবেচনা করবে:

>>> from collections import Counter
>>> a = [1,2,3,4,5]
>>> b = [1,3,5,6]
>>> d1, d2 = Counter(a), Counter(b)
>>> c = [n for n in d1.keys() & d2.keys() for _ in range(min(d1[n], d2[n]))]
>>> print(c)
[1,3,5]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.