আমি কীভাবে একটি তালিকার সদৃশগুলি খুঁজে পেতে এবং তাদের সাথে অন্য তালিকা তৈরি করতে পারি?


437

আমি কীভাবে পাইথন তালিকায় সদৃশগুলি খুঁজে পেতে এবং নকলগুলির অন্য একটি তালিকা তৈরি করতে পারি? তালিকায় কেবল পূর্ণসংখ্যা রয়েছে।



1
আপনি একবারে নকল চান, বা প্রতিবার এটি আবার দেখা হয়?
moooeeeep

আমি এখানে অনেক মিমোর দক্ষতার সাথে উত্তর দেওয়া হয়েছে বলে মনে করি। stackoverflow.com/a/642919/1748045 ছেদটি সেট পদ্ধতিতে একটি অন্তর্নির্মিত এবং যা প্রয়োজন ঠিক তা করা উচিত
টম স্মিথ

উত্তর:


545

সদৃশ ব্যবহার সরাতে set(a)। সদৃশ মুদ্রণ করতে, এরকম কিছু:

a = [1,2,3,2,1,5,6,5,5,5]

import collections
print([item for item, count in collections.Counter(a).items() if count > 1])

## [1, 2, 5]

দ্রষ্টব্য যে Counterএখানে বিশেষভাবে দক্ষ ( সময়সীমা ) নয় এবং সম্ভবত এখানে ওভারকিল। setআরও ভাল পারফর্ম করবে এই কোডটি উত্স ক্রমে অনন্য উপাদানের একটি তালিকা গণনা করে:

seen = set()
uniq = []
for x in a:
    if x not in seen:
        uniq.append(x)
        seen.add(x)

বা, আরও সংক্ষিপ্তভাবে:

seen = set()
uniq = [x for x in a if x not in seen and not seen.add(x)]    

আমি পরবর্তী শৈলীর প্রস্তাব দিই না, কারণ কী করছে তা স্পষ্ট নয় not seen.add(x)(সেট add()পদ্ধতিটি সর্বদা ফিরে আসে None, সুতরাং প্রয়োজনীয়তা not)।

লাইব্রেরি ছাড়াই নকল উপাদানগুলির তালিকা গণনা করতে:

seen = {}
dupes = []

for x in a:
    if x not in seen:
        seen[x] = 1
    else:
        if seen[x] == 1:
            dupes.append(x)
        seen[x] += 1

যদি তালিকার উপাদানগুলি হ্যাশযোগ্য না হয়, আপনি সেট / ডিক্ট ব্যবহার করতে পারবেন না এবং চতুর্ভুজ সময় সমাধান (প্রতিটিটির সাথে প্রতিটিের তুলনা করুন) অবলম্বন করতে হবে। উদাহরণ স্বরূপ:

a = [[1], [2], [3], [1], [5], [3]]

no_dupes = [x for n, x in enumerate(a) if x not in a[:n]]
print no_dupes # [[1], [2], [3], [5]]

dupes = [x for n, x in enumerate(a) if x in a[:n]]
print dupes # [[1], [3]]

2
@ এরিক: আমি এটি অনুমান করি O(n), কারণ এটি কেবল একবার তালিকা পুনরাবৃত্তি করে এবং সেট লুকআপ হয় O(1)
জর্জি

3
@ হুগো, নকলের তালিকাটি দেখতে, আমাদের কেবল ডুপ নামে একটি নতুন তালিকা তৈরি করতে হবে এবং অন্য একটি বিবৃতি যুক্ত করতে হবে। উদাহরণস্বরূপ:dup = [] else: dup.append(x)
ক্রিস নিলসন

4
@ অক্সিমন: আপনি সম্ভবত এটি পেয়েছেন তবে আপনাকে মুদ্রণ করার জন্য পাইথন 3-তে বন্ধনী বলা হয়print()
মোবার্গ

4
কেবলমাত্র সদৃশ পেতে আপনার উত্তর সেট () এর জন্য রূপান্তর করা। seen = set()তারপরেdupe = set(x for x in a if x in seen or seen.add(x))
946

2
পাইথন 3.x জন্য: মুদ্রণ ([আইটেমের জন্য আইটেম, collections.Counter গণনা (ক) .items () যদি গণনা> 1])
kibitzforu

327
>>> l = [1,2,3,4,4,5,5,6,1]
>>> set([x for x in l if l.count(x) > 1])
set([1, 4, 5])

2
জেনারেটর বোঝার পরিবর্তে আপনি কোনও তালিকা বোধগম্য ব্যবহার করার কোনও কারণ আছে?

64
প্রকৃতপক্ষে, একটি সহজ সমাধান, তবে জটিলতা স্কোয়ার করা হয়েছে কারণ প্রতিটি গণনা () তালিকাটিকে আবারও পার্স করে, তাই বৃহত তালিকার জন্য ব্যবহার করবেন না।
ডানুকার

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

@ জনলআরউই এর অর্থ হ'ল আমাদের এটি ব্যবহার করা উচিত নয়, কারণ প্রায় সবসময়ই বাছাই করার আরও কার্যকর (এবং সহজ) উপায় রয়েছে।
lostsoul29

1
@ ওয়াটসোনিক: আপনার "সিম্পল স্যুইচ" সাধারণ জটিলতায় চতুর্ভুজ থেকে স্কোয়ারের সময়ের জটিলতা হ্রাস করতে ব্যর্থ। কেবলমাত্র lসাথে প্রতিস্থাপন করা set(l)সবচেয়ে খারাপ সময়ের জটিলতা হ্রাস করে এবং তাই এই উত্তর দিয়ে বৃহত্তর স্কেল দক্ষতার উদ্বেগের সমাধান করতে কিছুই করে না । এটি সম্ভবত এত সহজ ছিল না। সংক্ষেপে, এটি করবেন না।
সিসিল কারি

82

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

def list_duplicates(seq):
  seen = set()
  seen_add = seen.add
  # adds all elements it doesn't know yet to seen and all other to seen_twice
  seen_twice = set( x for x in seq if x in seen or seen_add(x) )
  # turn the set into a list (as requested)
  return list( seen_twice )

a = [1,2,3,2,1,5,6,5,5,5]
list_duplicates(a) # yields [1, 2, 5]

গতির ক্ষেত্রে কেবল কিছু সময় এখানে দেওয়া আছে:

# file: test.py
import collections

def thg435(l):
    return [x for x, y in collections.Counter(l).items() if y > 1]

def moooeeeep(l):
    seen = set()
    seen_add = seen.add
    # adds all elements it doesn't know yet to seen and all other to seen_twice
    seen_twice = set( x for x in l if x in seen or seen_add(x) )
    # turn the set into a list (as requested)
    return list( seen_twice )

def RiteshKumar(l):
    return list(set([x for x in l if l.count(x) > 1]))

def JohnLaRooy(L):
    seen = set()
    seen2 = set()
    seen_add = seen.add
    seen2_add = seen2.add
    for item in L:
        if item in seen:
            seen2_add(item)
        else:
            seen_add(item)
    return list(seen2)

l = [1,2,3,2,1,5,6,5,5,5]*100

এখানে ফলাফলগুলি: (ভাল করেছেন @ জনলআরউই!)

$ python -mtimeit -s 'import test' 'test.JohnLaRooy(test.l)'
10000 loops, best of 3: 74.6 usec per loop
$ python -mtimeit -s 'import test' 'test.moooeeeep(test.l)'
10000 loops, best of 3: 91.3 usec per loop
$ python -mtimeit -s 'import test' 'test.thg435(test.l)'
1000 loops, best of 3: 266 usec per loop
$ python -mtimeit -s 'import test' 'test.RiteshKumar(test.l)'
100 loops, best of 3: 8.35 msec per loop

মজার বিষয় হল, পাইপি ব্যবহার করার সময় সময় ছাড়াও, র‌্যাঙ্কিংও সামান্য পরিবর্তিত হয়। সবচেয়ে মজার বিষয় হচ্ছে, কাউন্টার-ভিত্তিক পদ্ধতির পাইপির অপ্টিমাইজেশানগুলি থেকে প্রচুর উপকার পাওয়া যায়, যেখানে আমি প্রস্তাবিত পদ্ধতিটি ক্যাশে করার পদ্ধতির প্রায় কোনও প্রভাব নেই বলে মনে হয়।

$ pypy -mtimeit -s 'import test' 'test.JohnLaRooy(test.l)'
100000 loops, best of 3: 17.8 usec per loop
$ pypy -mtimeit -s 'import test' 'test.thg435(test.l)'
10000 loops, best of 3: 23 usec per loop
$ pypy -mtimeit -s 'import test' 'test.moooeeeep(test.l)'
10000 loops, best of 3: 39.3 usec per loop

পরিষ্কারভাবে এই প্রভাবটি ইনপুট ডেটার "সদৃশতা" এর সাথে সম্পর্কিত। আমি l = [random.randrange(1000000) for i in xrange(10000)]এই ফলাফলগুলি সেট করেছিলাম এবং পেয়েছি:

$ pypy -mtimeit -s 'import test' 'test.moooeeeep(test.l)'
1000 loops, best of 3: 495 usec per loop
$ pypy -mtimeit -s 'import test' 'test.JohnLaRooy(test.l)'
1000 loops, best of 3: 499 usec per loop
$ pypy -mtimeit -s 'import test' 'test.thg435(test.l)'
1000 loops, best of 3: 1.68 msec per loop

6
শুধু কৌতূহলী - দেখে_এডিডি = দেখে.এড এর উদ্দেশ্য কী?
রব

3
@ রব এইভাবে আপনি যে ফাংশনটি আগে একবার দেখেছেন তাকে কল করুন। অন্যথায় আপনাকে addপ্রত্যেক বার সন্নিবেশ করা প্রয়োজন হলে সদস্য ক্রিয়াকলাপটি (একটি অভিধান কোয়েরি) সন্ধান করতে হবে।
moooeeeep

আমার নিজের ডেটা দিয়ে পরীক্ষা করা হয়েছে এবং আইপিথনের% সময়কাল আপনার পদ্ধতিটি টেস্টে সবচেয়ে দ্রুত দেখায় কিন্তু "" সবচেয়ে ধীরতম রানটি দ্রুততমের চেয়ে ৪.৪৪ গুণ বেশি সময় নিয়েছে This এর অর্থ এই হতে পারে যে একটি মধ্যবর্তী ফলাফল ক্যাশে হচ্ছে "
জুপ

1
@ মুওইইপ, চেষ্টা করার জন্য আমি আপনার স্ক্রিপ্টে আরও একটি সংস্করণ যুক্ত করেছি :) এছাড়াও চেষ্টা করুন pypyযদি আপনি এটি ব্যবহার করেন এবং গতিতে চলেছেন।
জন লা রোয়

@ জনলআরউই পারফরম্যান্সে দুর্দান্ত উন্নতি করেছেন! মজার বিষয় হল, যখন আমি ফলাফলগুলি মূল্যায়নের জন্য পাইপি ব্যবহার করি, তখন কাউন্টার-ভিত্তিক পদ্ধতির উল্লেখযোগ্যভাবে উন্নতি হয়।
moooeeeep

42

আপনি ব্যবহার করতে পারেন iteration_utilities.duplicates:

>>> from iteration_utilities import duplicates

>>> list(duplicates([1,1,2,1,2,3,4,2]))
[1, 1, 2, 2]

বা আপনি যদি কেবল প্রতিটি নকলের একটি চান তবে এটির সাথে একত্রিত হতে পারে iteration_utilities.unique_everseen:

>>> from iteration_utilities import unique_everseen

>>> list(unique_everseen(duplicates([1,1,2,1,2,3,4,2])))
[1, 2]

এটি অপ্রয়োজনীয় উপাদানগুলি পরিচালনা করতে পারে (তবে পারফরম্যান্সের ব্যয়ে):

>>> list(duplicates([[1], [2], [1], [3], [1]]))
[[1], [1]]

>>> list(unique_everseen(duplicates([[1], [2], [1], [3], [1]])))
[[1]]

এটি এমন কিছু যা এখানে অন্যান্য কয়েকটি পদ্ধতির মধ্যে কেবল কয়েকটি পরিচালনা করতে পারে।

benchmarks

আমি এখানে বর্ণিত পদ্ধতির বেশিরভাগ (তবে সমস্ত নয়) একটি দ্রুত বেঞ্চমার্ক করেছি।

প্রথম মানদণ্ডে কেবলমাত্র কয়েকটি দৈর্ঘ্যের তালিকা-দৈর্ঘ্যের অন্তর্ভুক্ত ছিল কারণ কিছু পদ্ধতির রয়েছে O(n**2) আচরণ রয়েছে।

গ্রাফগুলিতে y- অক্ষ সময়টির প্রতিনিধিত্ব করে, তাই একটি নিম্ন মানের অর্থ আরও ভাল। এটি লগ-লগেরও পরিকল্পনা করা হয়েছে যাতে মানগুলির বিস্তৃত আরও ভালভাবে কল্পনা করা যায়:

এখানে চিত্র বর্ণনা লিখুন

অপসারণ করা হচ্ছে O(n**2)পন্থাগুলি আমি তালিকায় অর্ধ মিলিয়ন উপাদান পর্যন্ত অন্য একটি মানদণ্ড করেছি:

এখানে চিত্র বর্ণনা লিখুন

আপনি দেখতে পাচ্ছেন যে iteration_utilities.duplicatesএপ্রোচটি অন্য যে কোনও পদ্ধতির এবং এমনকি শৃঙ্খলার চেয়েও দ্রুতunique_everseen(duplicates(...)) অন্যান্য পদ্ধতির তুলনায় দ্রুত বা সমান দ্রুত ছিল।

এখানে আরও একটি আকর্ষণীয় বিষয় লক্ষণীয় হ'ল ছোট পান্ডের জন্য পান্ডাসের পন্থাগুলি খুব ধীর হলেও দীর্ঘ তালিকার জন্য সহজেই প্রতিযোগিতা করতে পারে।

তবে এই মানদণ্ডগুলি দেখায় যে বেশিরভাগ পন্থাগুলি প্রায় সমানভাবে সঞ্চালিত হয়, তাই কোনটি ব্যবহৃত হয় তা নিয়ে কিছু আসে যায় না ( O(n**2)রানটাইম ছিল এমন 3 টি বাদে )।

from iteration_utilities import duplicates, unique_everseen
from collections import Counter
import pandas as pd
import itertools

def georg_counter(it):
    return [item for item, count in Counter(it).items() if count > 1]

def georg_set(it):
    seen = set()
    uniq = []
    for x in it:
        if x not in seen:
            uniq.append(x)
            seen.add(x)

def georg_set2(it):
    seen = set()
    return [x for x in it if x not in seen and not seen.add(x)]   

def georg_set3(it):
    seen = {}
    dupes = []

    for x in it:
        if x not in seen:
            seen[x] = 1
        else:
            if seen[x] == 1:
                dupes.append(x)
            seen[x] += 1

def RiteshKumar_count(l):
    return set([x for x in l if l.count(x) > 1])

def moooeeeep(seq):
    seen = set()
    seen_add = seen.add
    # adds all elements it doesn't know yet to seen and all other to seen_twice
    seen_twice = set( x for x in seq if x in seen or seen_add(x) )
    # turn the set into a list (as requested)
    return list( seen_twice )

def F1Rumors_implementation(c):
    a, b = itertools.tee(sorted(c))
    next(b, None)
    r = None
    for k, g in zip(a, b):
        if k != g: continue
        if k != r:
            yield k
            r = k

def F1Rumors(c):
    return list(F1Rumors_implementation(c))

def Edward(a):
    d = {}
    for elem in a:
        if elem in d:
            d[elem] += 1
        else:
            d[elem] = 1
    return [x for x, y in d.items() if y > 1]

def wordsmith(a):
    return pd.Series(a)[pd.Series(a).duplicated()].values

def NikhilPrabhu(li):
    li = li.copy()
    for x in set(li):
        li.remove(x)

    return list(set(li))

def firelynx(a):
    vc = pd.Series(a).value_counts()
    return vc[vc > 1].index.tolist()

def HenryDev(myList):
    newList = set()

    for i in myList:
        if myList.count(i) >= 2:
            newList.add(i)

    return list(newList)

def yota(number_lst):
    seen_set = set()
    duplicate_set = set(x for x in number_lst if x in seen_set or seen_set.add(x))
    return seen_set - duplicate_set

def IgorVishnevskiy(l):
    s=set(l)
    d=[]
    for x in l:
        if x in s:
            s.remove(x)
        else:
            d.append(x)
    return d

def it_duplicates(l):
    return list(duplicates(l))

def it_unique_duplicates(l):
    return list(unique_everseen(duplicates(l)))

বেঞ্চমার্ক ঘ

from simple_benchmark import benchmark
import random

funcs = [
    georg_counter, georg_set, georg_set2, georg_set3, RiteshKumar_count, moooeeeep, 
    F1Rumors, Edward, wordsmith, NikhilPrabhu, firelynx,
    HenryDev, yota, IgorVishnevskiy, it_duplicates, it_unique_duplicates
]

args = {2**i: [random.randint(0, 2**(i-1)) for _ in range(2**i)] for i in range(2, 12)}

b = benchmark(funcs, args, 'list size')

b.plot()

বেঞ্চমার্ক 2

funcs = [
    georg_counter, georg_set, georg_set2, georg_set3, moooeeeep, 
    F1Rumors, Edward, wordsmith, firelynx,
    yota, IgorVishnevskiy, it_duplicates, it_unique_duplicates
]

args = {2**i: [random.randint(0, 2**(i-1)) for _ in range(2**i)] for i in range(2, 20)}

b = benchmark(funcs, args, 'list size')
b.plot()

দাবি পরিত্যাগী

1 আমি লিখেছি একটি তৃতীয় পক্ষের লাইব্রেরি থেকে হল: iteration_utilities


1
আমি এখানে আমার ঘাড়ে আটকে যাচ্ছি এবং পাইথনের চেয়ে সিতে কাজ করার জন্য একটি স্পপ লাইব্রেরি লেখার পরামর্শ দিচ্ছি সম্ভবত যে উত্তরটির সন্ধান করা হচ্ছিল তা নয় - তবে এটি একটি বৈধ পন্থা! আমি উত্তরের প্রস্থ এবং ফলাফলগুলির গ্রাফিকাল প্রদর্শনটি পছন্দ করি - তারা রূপান্তরিত হয় দেখে খুব ভাল লাগে, আমাকে আরও আশ্চর্য করে তোলে যে ইনপুটগুলি আরও বাড়লে তারা কি কখনও ক্রস করে! প্রশ্ন: সম্পূর্ণ র্যান্ডম তালিকার বিপরীতে বেশিরভাগ বাছাই করা তালিকার ফলাফল কী?
এফ

30

আমি এই প্রশ্নটি জুড়ে এসে পৌঁছেছি এমন কিছুর সাথে সম্পর্কিত - এবং অবাক হয়েছি কেন কেউ জেনারেটর ভিত্তিক সমাধানের প্রস্তাব দেয় না? এই সমস্যা সমাধান করা হবে:

>>> print list(getDupes_9([1,2,3,2,1,5,6,5,5,5]))
[1, 2, 5]

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

আমি তুলনা করার জন্য @ মূওইয়িপকে অন্তর্ভুক্ত করেছি (এটি চিত্তাকর্ষকভাবে দ্রুত: ইনপুট তালিকাটি সম্পূর্ণ এলোমেলো হলে দ্রুততম) এবং বেশিরভাগ সাজানো তালিকার জন্য আবার আরও দ্রুততর একটি আইট্রোলস অ্যাপ্রোচ রয়েছে ... এখন @ ফায়ার্লিনেক্সের পান্ডাস পদ্ধতির অন্তর্ভুক্ত রয়েছে - ধীর, তবে নয় ভয়ানকভাবে তাই, এবং সহজ। দ্রষ্টব্য - বাছাই / টি / জিপ পদ্ধতি আমার মেশিনে নিয়মিতভাবে বেশিরভাগ দ্রুত অর্ডারযুক্ত তালিকার জন্য দ্রুত হয়, মুফিয়েপ তালিকার পক্ষে দ্রুততর হয় তবে আপনার মাইলেজটি পৃথক হতে পারে।

সুবিধাদি

  • একই কোড ব্যবহার করে 'কোনও' নকলের জন্য পরীক্ষা করা খুব দ্রুত সহজ

অনুমিতি

  • সদৃশগুলি একবারে প্রতিবেদন করা উচিত
  • সদৃশ অর্ডার সংরক্ষণ করার প্রয়োজন নেই
  • সদৃশ তালিকার যে কোনও জায়গায় থাকতে পারে

দ্রুততম সমাধান, 1 এম এন্ট্রি:

def getDupes(c):
        '''sort/tee/izip'''
        a, b = itertools.tee(sorted(c))
        next(b, None)
        r = None
        for k, g in itertools.izip(a, b):
            if k != g: continue
            if k != r:
                yield k
                r = k

পদ্ধতির পরীক্ষিত

import itertools
import time
import random

def getDupes_1(c):
    '''naive'''
    for i in xrange(0, len(c)):
        if c[i] in c[:i]:
            yield c[i]

def getDupes_2(c):
    '''set len change'''
    s = set()
    for i in c:
        l = len(s)
        s.add(i)
        if len(s) == l:
            yield i

def getDupes_3(c):
    '''in dict'''
    d = {}
    for i in c:
        if i in d:
            if d[i]:
                yield i
                d[i] = False
        else:
            d[i] = True

def getDupes_4(c):
    '''in set'''
    s,r = set(),set()
    for i in c:
        if i not in s:
            s.add(i)
        elif i not in r:
            r.add(i)
            yield i

def getDupes_5(c):
    '''sort/adjacent'''
    c = sorted(c)
    r = None
    for i in xrange(1, len(c)):
        if c[i] == c[i - 1]:
            if c[i] != r:
                yield c[i]
                r = c[i]

def getDupes_6(c):
    '''sort/groupby'''
    def multiple(x):
        try:
            x.next()
            x.next()
            return True
        except:
            return False
    for k, g in itertools.ifilter(lambda x: multiple(x[1]), itertools.groupby(sorted(c))):
        yield k

def getDupes_7(c):
    '''sort/zip'''
    c = sorted(c)
    r = None
    for k, g in zip(c[:-1],c[1:]):
        if k == g:
            if k != r:
                yield k
                r = k

def getDupes_8(c):
    '''sort/izip'''
    c = sorted(c)
    r = None
    for k, g in itertools.izip(c[:-1],c[1:]):
        if k == g:
            if k != r:
                yield k
                r = k

def getDupes_9(c):
    '''sort/tee/izip'''
    a, b = itertools.tee(sorted(c))
    next(b, None)
    r = None
    for k, g in itertools.izip(a, b):
        if k != g: continue
        if k != r:
            yield k
            r = k

def getDupes_a(l):
    '''moooeeeep'''
    seen = set()
    seen_add = seen.add
    # adds all elements it doesn't know yet to seen and all other to seen_twice
    for x in l:
        if x in seen or seen_add(x):
            yield x

def getDupes_b(x):
    '''iter*/sorted'''
    x = sorted(x)
    def _matches():
        for k,g in itertools.izip(x[:-1],x[1:]):
            if k == g:
                yield k
    for k, n in itertools.groupby(_matches()):
        yield k

def getDupes_c(a):
    '''pandas'''
    import pandas as pd
    vc = pd.Series(a).value_counts()
    i = vc[vc > 1].index
    for _ in i:
        yield _

def hasDupes(fn,c):
    try:
        if fn(c).next(): return True    # Found a dupe
    except StopIteration:
        pass
    return False

def getDupes(fn,c):
    return list(fn(c))

STABLE = True
if STABLE:
    print 'Finding FIRST then ALL duplicates, single dupe of "nth" placed element in 1m element array'
else:
    print 'Finding FIRST then ALL duplicates, single dupe of "n" included in randomised 1m element array'
for location in (50,250000,500000,750000,999999):
    for test in (getDupes_2, getDupes_3, getDupes_4, getDupes_5, getDupes_6,
                 getDupes_8, getDupes_9, getDupes_a, getDupes_b, getDupes_c):
        print 'Test %-15s:%10d - '%(test.__doc__ or test.__name__,location),
        deltas = []
        for FIRST in (True,False):
            for i in xrange(0, 5):
                c = range(0,1000000)
                if STABLE:
                    c[0] = location
                else:
                    c.append(location)
                    random.shuffle(c)
                start = time.time()
                if FIRST:
                    print '.' if location == test(c).next() else '!',
                else:
                    print '.' if [location] == list(test(c)) else '!',
                deltas.append(time.time()-start)
            print ' -- %0.3f  '%(sum(deltas)/len(deltas)),
        print
    print

'সমস্ত দ্বৈত' পরীক্ষার ফলাফলগুলি সামঞ্জস্যপূর্ণ ছিল, এই অ্যারেতে "প্রথম" সদৃশ এবং তারপরে "সমস্ত" নকল খুঁজে পেয়েছিল:

Finding FIRST then ALL duplicates, single dupe of "nth" placed element in 1m element array
Test set len change :    500000 -  . . . . .  -- 0.264   . . . . .  -- 0.402  
Test in dict        :    500000 -  . . . . .  -- 0.163   . . . . .  -- 0.250  
Test in set         :    500000 -  . . . . .  -- 0.163   . . . . .  -- 0.249  
Test sort/adjacent  :    500000 -  . . . . .  -- 0.159   . . . . .  -- 0.229  
Test sort/groupby   :    500000 -  . . . . .  -- 0.860   . . . . .  -- 1.286  
Test sort/izip      :    500000 -  . . . . .  -- 0.165   . . . . .  -- 0.229  
Test sort/tee/izip  :    500000 -  . . . . .  -- 0.145   . . . . .  -- 0.206  *
Test moooeeeep      :    500000 -  . . . . .  -- 0.149   . . . . .  -- 0.232  
Test iter*/sorted   :    500000 -  . . . . .  -- 0.160   . . . . .  -- 0.221  
Test pandas         :    500000 -  . . . . .  -- 0.493   . . . . .  -- 0.499  

তালিকাগুলি প্রথমে পরিবর্তিত হলে, সাজানোর দামটি সুস্পষ্ট হয়ে যায় - দক্ষতা লক্ষণীয়ভাবে হ্রাস পায় এবং @ মূইইউইপ পদ্ধতির উপর প্রাধান্য পেয়েছে, সেট এবং ডিক পদ্ধতির সাথে একই রকম তবে লটার পারফর্মার রয়েছে:

Finding FIRST then ALL duplicates, single dupe of "n" included in randomised 1m element array
Test set len change :    500000 -  . . . . .  -- 0.321   . . . . .  -- 0.473  
Test in dict        :    500000 -  . . . . .  -- 0.285   . . . . .  -- 0.360  
Test in set         :    500000 -  . . . . .  -- 0.309   . . . . .  -- 0.365  
Test sort/adjacent  :    500000 -  . . . . .  -- 0.756   . . . . .  -- 0.823  
Test sort/groupby   :    500000 -  . . . . .  -- 1.459   . . . . .  -- 1.896  
Test sort/izip      :    500000 -  . . . . .  -- 0.786   . . . . .  -- 0.845  
Test sort/tee/izip  :    500000 -  . . . . .  -- 0.743   . . . . .  -- 0.804  
Test moooeeeep      :    500000 -  . . . . .  -- 0.234   . . . . .  -- 0.311  *
Test iter*/sorted   :    500000 -  . . . . .  -- 0.776   . . . . .  -- 0.840  
Test pandas         :    500000 -  . . . . .  -- 0.539   . . . . .  -- 0.540  

@ মূওইয়িপ - আইফিল্টার / আইজিআইপি / টি পদ্ধতির বিষয়ে আপনার মতামতগুলি দেখতে আগ্রহী হন।
এফ

1
এই উত্তরটি অবিশ্বাস্যভাবে ভাল I আমি বুঝতে পারি না যে এর ব্যাখ্যা এবং পরীক্ষাগুলির জন্য এর বেশি পয়েন্ট নেই যা এটির প্রয়োজন হবে তাদের পক্ষে খুব দরকারী।
dlewin

1
পাইথনের ধরণ হ'ল ও (এন) হয় যখন কেবলমাত্র একটি আইটেম অর্ডার না করে। আপনার এটির random.shuffle(c)জন্য অ্যাকাউন্ট করা উচিত । আনল্টারড স্ক্রিপ্টটি চালানোর সময় আমি আপনার ফলাফলগুলি প্রতিলিপি করতে পারি না (সম্পূর্ণ ভিন্ন ক্রম), সুতরাং এটি সিপিইউর উপরও নির্ভরশীল।
জন লা রুয়ে

আপনাকে @ জন-লা-রুই ধন্যবাদ, সিপিইউ / স্থানীয় মেশিনের উপর চিত্তাকর্ষক পর্যবেক্ষণ কার্যকর হওয়ায় - তাই আমার ওয়াইওয়াইএমভি আইটেমটি সংশোধন করা উচিত । ব্যবহার হে (ঢ) সাজানোর ইচ্ছাকৃত ছিল: duplicative উপাদান বিভিন্ন অবস্থানগুলি এ ঢোকানো হয় বিশেষভাবে পদ্ধতির প্রভাব নিরূপণের জন্য যদি একটি ভাল মধ্যে একমাত্র সদৃশ এই সঙ্গে (তালিকা শুরুতে) অথবা খারাপ (তালিকা শেষে) অবস্থান পন্থা। আমি একটি এলোমেলো তালিকা হিসাবে বিবেচনা করেছি - উদাহরণস্বরূপ random.shuffle - তবে সিদ্ধান্ত নিয়েছি যে আমি আরও অনেক রান করলেই বোধগম্য হবে! আমাকে ফিরে আসতে হবে এবং একাধিক রান / এলোমেলো সমতুল্য হয়ে উঠতে হবে এবং এর প্রভাব কী হবে তা দেখতে হবে।
এফ 1 গুজব 19

@ ফায়ার্লিনেক্স প্যান্ডাস পদ্ধতির অন্তর্ভুক্ত এবং পুরোপুরি বদলানো তালিকার পাশাপাশি বাছাই করা তালিকাতে সংশোধন করা হয়েছে। এটি কারণ পাইথনের ব্যবহৃত নেটিভ টাইমসোর্টটি বেশিরভাগ সাজানো ডেটা (সেরা কেস) এর উপরে দ্রুত দুষ্ট এবং পরিবর্তিত তালিকাগুলি এটির সবচেয়ে খারাপ পরিস্থিতি - যা ফলাফলকে সরিয়ে দেয়।
এফ 1 গুজব


10

সংগ্রহসমূহ.কৌনটারটি পাইথন ২.7 এ নতুন:


Python 2.5.4 (r254:67916, May 31 2010, 15:03:39) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2
a = [1,2,3,2,1,5,6,5,5,5]
import collections
print [x for x, y in collections.Counter(a).items() if y > 1]
Type "help", "copyright", "credits" or "license" for more information.
  File "", line 1, in 
AttributeError: 'module' object has no attribute 'Counter'
>>> 

পূর্ববর্তী সংস্করণে আপনি পরিবর্তে একটি প্রচলিত ডিক ব্যবহার করতে পারেন:

a = [1,2,3,2,1,5,6,5,5,5]
d = {}
for elem in a:
    if elem in d:
        d[elem] += 1
    else:
        d[elem] = 1

print [x for x, y in d.items() if y > 1]

9

এখানে একটি ঝরঝরে এবং সংক্ষিপ্ত সমাধান -

for x in set(li):
    li.remove(x)

li = list(set(li))

যদিও মূল তালিকাটি হারিয়ে গেছে। বিষয়গুলি অন্য তালিকায় অনুলিপি করার মাধ্যমে এটি স্থির করা যেতে পারে - টেম্প = লি [:]
নিখিল প্রভু

3
এটি বৃহত তালিকাগুলিতে বেশ বাজে অনুশীলন - তালিকা থেকে উপাদানগুলি সরানো বেশ ব্যয়বহুল!
এফ 1 গুজব 11

7

তালিকায় রূপান্তর না করে এবং সম্ভবত সহজ উপায়টি নীচের মতো কিছু হবে। কোনও সাক্ষাত্কারের সময় এটি কার্যকর হতে পারে যখন তারা সেট ব্যবহার না করতে বলে

a=[1,2,3,3,3]
dup=[]
for each in a:
  if each not in dup:
    dup.append(each)
print(dup)

======== অনন্য মান এবং সদৃশ মানগুলির 2 টি পৃথক তালিকা পেতে

a=[1,2,3,3,3]
uniques=[]
dups=[]

for each in a:
  if each not in uniques:
    uniques.append(each)
  else:
    dups.append(each)
print("Unique values are below:")
print(uniques)
print("Duplicate values are below:")
print(dups)

1
এটির (বা মূল তালিকা) এর সদৃশগুলির তালিকার ফলস্বরূপ ফল পাওয়া যায় না, এর ফলে (বা মূল তালিকা) এর সমস্ত অনন্য উপাদানগুলির একটি তালিকার ফলস্বরূপ। "ডুপ" তালিকা তৈরির পরে কেউ কী করবে?
গেমকডার 95

6

আমি পান্ডার সাহায্যে এটি করতাম, কারণ আমি প্রচুর পান্ডা ব্যবহার করি

import pandas as pd
a = [1,2,3,3,3,4,5,6,6,7]
vc = pd.Series(a).value_counts()
vc[vc > 1].index.tolist()

দেয়

[3,6]

সম্ভবত খুব দক্ষ নয়, তবে এটি অন্যান্য উত্তরগুলির চেয়ে অনেক কম কোড, তাই আমি ভেবেছিলাম আমি অবদান রাখব


3
এছাড়াও নোট করুন যে pda = pd.Series(a) print list(pda[pda.duplicated()])
পান্ডাসে

6

গৃহীত উত্তরের তৃতীয় উদাহরণ একটি ভ্রান্ত উত্তর দেয় এবং সদৃশ দেওয়ার চেষ্টা করে না। এখানে সঠিক সংস্করণ:

number_lst = [1, 1, 2, 3, 5, ...]

seen_set = set()
duplicate_set = set(x for x in number_lst if x in seen_set or seen_set.add(x))
unique_set = seen_set - duplicate_set

6

ঘটনার সংখ্যা যাচাই করে তালিকার প্রতিটি উপাদানকে কেবল কীভাবে লুপ করা যায় তারপরে সেগুলিতে এমন একটি জুড়ুন যা ডুপ্লিকেটগুলি মুদ্রণ করবে। আশা করছি এটা ওখানে কাওকে সাহায্য করবে.

myList  = [2 ,4 , 6, 8, 4, 6, 12];
newList = set()

for i in myList:
    if myList.count(i) >= 2:
        newList.add(i)

print(list(newList))
## [4 , 6]

5

itertools.groupbyডুপস রয়েছে এমন সমস্ত আইটেম সন্ধানের জন্য আমরা ব্যবহার করতে পারি:

from itertools import groupby

myList  = [2, 4, 6, 8, 4, 6, 12]
# when the list is sorted, groupby groups by consecutive elements which are similar
for x, y in groupby(sorted(myList)):
    #  list(y) returns all the occurences of item x
    if len(list(y)) > 1:
        print x  

আউটপুটটি হবে:

4
6

1
অথবা আরো সংক্ষেপে নিম্নোক্তভাবে:dupes = [x for x, y in groupby(sorted(myList)) if len(list(y)) > 1]
frnhr

5

আমি মনে করি একটি তালিকার সদৃশ সন্ধান করার সবচেয়ে কার্যকর উপায় হ'ল:

from collections import Counter

def duplicates(values):
    dups = Counter(values) - Counter(set(values))
    return list(dups.keys())

print(duplicates([1,2,3,6,5,2]))

এটি Counterসমস্ত উপাদান এবং সমস্ত অনন্য উপাদান ব্যবহার করে। প্রথমটির দ্বিতীয়টির সাথে বিয়োগ করলে কেবল নকলই বেরিয়ে যাবে।


4

কিছুটা দেরি হলেও কারও কারও পক্ষে সহায়ক। লার্জিশ তালিকার জন্য, আমি এটি আমার জন্য কাজ পেয়েছি।

l=[1,2,3,5,4,1,3,1]
s=set(l)
d=[]
for x in l:
    if x in s:
        s.remove(x)
    else:
        d.append(x)
d
[1,3,1]

কেবল এবং সমস্ত সদৃশ এবং অর্ডার সংরক্ষণ করে।


3

পাইথনের এক পুনরাবৃত্তির সাথে ডুপস সন্ধান করার খুব সহজ এবং দ্রুত উপায়:

testList = ['red', 'blue', 'red', 'green', 'blue', 'blue']

testListDict = {}

for item in testList:
  try:
    testListDict[item] += 1
  except:
    testListDict[item] = 1

print testListDict

ফলাফল নিম্নরূপ হবে:

>>> print testListDict
{'blue': 3, 'green': 1, 'red': 2}

এটি এবং আমার ব্লগ http://www.howtoprogramwithpython.com এ আরও


3

আমি এই আলোচনায় অনেক দেরীতে প্রবেশ করছি। যদিও, আমি একটি লাইনারগুলির সাথে এই সমস্যাটি মোকাবেলা করতে চাই। কারণ এটি পাইথনের কবজ। যদি আমরা কেবল নকলগুলি একটি পৃথক তালিকায় (বা কোনও সংগ্রহ) পেতে চাই, তবে আমি নীচের মতো করে প্রস্তাব করব ay আমাদের একটি সদৃশ তালিকা রয়েছে যা আমরা 'টার্গেট' হিসাবে বলতে পারি

    target=[1,2,3,4,4,4,3,5,6,8,4,3]

এখন যদি আমরা সদৃশগুলি পেতে চাই, আমরা নীচের মতো একটি লাইনার ব্যবহার করতে পারি:

    duplicates=dict(set((x,target.count(x)) for x in filter(lambda rec : target.count(rec)>1,target)))

এই কোডটি সদৃশ রেকর্ডগুলি কী হিসাবে রাখবে এবং অভিধানে 'ডুপ্লিকেট' হিসাবে মান হিসাবে গণনা করবে। 'সদৃশ' অভিধানটি নীচের মত দেখাচ্ছে:

    {3: 3, 4: 4} #it saying 3 is repeated 3 times and 4 is 4 times

আপনি যদি কেবল তালিকায় ডুপ্লিকেট সহ সমস্ত রেকর্ড চান তবে এটি আবার আরও সংক্ষিপ্ত কোড:

    duplicates=filter(lambda rec : target.count(rec)>1,target)

আউটপুট হবে:

    [3, 4, 4, 4, 3, 4, 3]

এটি পাইথন ২.7.x + সংস্করণগুলিতে পুরোপুরি কাজ করে


3

পাইথন ৩.৮ ওয়ান-লাইনার যদি আপনি নিজের অ্যালগরিদম লিখতে বা লাইব্রেরি ব্যবহার করতে আগ্রহী না হন:

l = [1,2,3,2,1,5,6,5,5,5]

res = [(x, count) for x, g in groupby(sorted(l)) if (count := len(list(g))) > 1]

print(res)

মুদ্রণ আইটেম এবং গণনা:

[(1, 2), (2, 2), (5, 4)]

groupby একটি গ্রুপিং ফাংশন নেয় যাতে আপনি বিভিন্নভাবে আপনার গ্রুপিং সংজ্ঞায়িত করতে এবং অতিরিক্ত ফিরে আসতে পারেন Tuple প্রয়োজন হিসাবে ক্ষেত্রগুলি ।

groupby অলস তাই এটি খুব ধীর হওয়া উচিত নয়।


2

অন্য কিছু পরীক্ষা। অবশ্যই ...

set([x for x in l if l.count(x) > 1])

... খুব ব্যয়বহুল। পরবর্তী চূড়ান্ত পদ্ধতিটি ব্যবহার করতে এটি প্রায় 500 গুণ দ্রুত (আরও দীর্ঘ অ্যারে আরও ভাল ফলাফল দেয়):

def dups_count_dict(l):
    d = {}

    for item in l:
        if item not in d:
            d[item] = 0

        d[item] += 1

    result_d = {key: val for key, val in d.iteritems() if val > 1}

    return result_d.keys()

কেবল 2 টি লুপ, খুব ব্যয়বহুল নয় l.count() ক্রিয়াকলাপ নেই।

উদাহরণগুলির জন্য পদ্ধতিগুলির তুলনা করার জন্য এখানে একটি কোড রয়েছে। কোডটি নীচে, এখানে আউটপুট রয়েছে:

dups_count: 13.368s # this is a function which uses l.count()
dups_count_dict: 0.014s # this is a final best function (of the 3 functions)
dups_count_counter: 0.024s # collections.Counter

পরীক্ষার কোড:

import numpy as np
from time import time
from collections import Counter

class TimerCounter(object):
    def __init__(self):
        self._time_sum = 0

    def start(self):
        self.time = time()

    def stop(self):
        self._time_sum += time() - self.time

    def get_time_sum(self):
        return self._time_sum


def dups_count(l):
    return set([x for x in l if l.count(x) > 1])


def dups_count_dict(l):
    d = {}

    for item in l:
        if item not in d:
            d[item] = 0

        d[item] += 1

    result_d = {key: val for key, val in d.iteritems() if val > 1}

    return result_d.keys()


def dups_counter(l):
    counter = Counter(l)    

    result_d = {key: val for key, val in counter.iteritems() if val > 1}

    return result_d.keys()



def gen_array():
    np.random.seed(17)
    return list(np.random.randint(0, 5000, 10000))


def assert_equal_results(*results):
    primary_result = results[0]
    other_results = results[1:]

    for other_result in other_results:
        assert set(primary_result) == set(other_result) and len(primary_result) == len(other_result)


if __name__ == '__main__':
    dups_count_time = TimerCounter()
    dups_count_dict_time = TimerCounter()
    dups_count_counter = TimerCounter()

    l = gen_array()

    for i in range(3):
        dups_count_time.start()
        result1 = dups_count(l)
        dups_count_time.stop()

        dups_count_dict_time.start()
        result2 = dups_count_dict(l)
        dups_count_dict_time.stop()

        dups_count_counter.start()
        result3 = dups_counter(l)
        dups_count_counter.stop()

        assert_equal_results(result1, result2, result3)

    print 'dups_count: %.3f' % dups_count_time.get_time_sum()
    print 'dups_count_dict: %.3f' % dups_count_dict_time.get_time_sum()
    print 'dups_count_counter: %.3f' % dups_count_counter.get_time_sum()

2

পদ্ধতি 1:

list(set([val for idx, val in enumerate(input_list) if val in input_list[idx+1:]]))

ব্যাখ্যা: [আইডিএক্সের জন্য ভাল, ইনপুট_লিস্টে ভাল ইনপুট_লিস্ট যদি ইনপুট_লিস্ট] [আইডিএক্স + ১:]] একটি তালিকা বোধগম্যতা, যা একটি উপাদান ফেরত দেয়, যদি একই উপাদানটি তার বর্তমান অবস্থান থেকে উপস্থিত থাকে তবে তালিকায়, সূচকে ।

উদাহরণ: ইনপুট_লিস্ট = [42,31,42,31,3,31,31,5,6,6,6,6,6,7,42]

তালিকার প্রথম উপাদানটির সাথে সূচক, 42, সূচক 0 দিয়ে শুরু করে, এটি 42 উপাদানটি ইনপুট-লিস্টে উপস্থিত রয়েছে কিনা তা পরীক্ষা করে [1:] (যেমন, সূচী 1 থেকে তালিকার শেষ অবধি) কারণ 42 ইনপুট_লিস্টে উপস্থিত রয়েছে [1:] , এটি 42 ফিরে আসবে।

তারপরে এটি সূচক 1 সহ পরবর্তী উপাদান 31 এ চলে যায় এবং ইনপুট তালিকাতে [৩] উপাদান উপস্থিত থাকে কিনা তা পরীক্ষা করে [২:] (অর্থাত্ সূচী 2 থেকে তালিকার শেষ অবধি), কারণ 31 ইনপুট_লিস্টে উপস্থিত রয়েছে [2:], এটি 31 ফিরে আসবে।

একইভাবে এটি তালিকার সমস্ত উপাদানগুলির মধ্য দিয়ে যায় এবং কেবল পুনরাবৃত্তি / নকল উপাদানগুলিকে একটি তালিকায় ফিরিয়ে দেয়।

তারপরে আমাদের ডুপ্লিকেট রয়েছে, একটি তালিকায় আমাদের প্রতিটি নকলের একটি বাছাই করা দরকার, অর্থাৎ নকলগুলির মধ্যে সদৃশ সরিয়ে ফেলতে হবে এবং এটি করার জন্য, আমরা একটি পাইথনটি বিল্ট-ইন নামক সেট () কল করি এবং এটি নকলগুলি সরিয়ে দেয়,

তারপরে আমরা একটি সেট রেখেছি, তবে একটি তালিকা নয়, এবং সুতরাং সেট থেকে তালিকাতে রূপান্তর করতে আমরা ব্যবহার করি, টাইপকাস্টিং, তালিকা (), এবং এটি উপাদানগুলির সেটকে তালিকায় রূপান্তর করে।

পদ্ধতি 2:

def dupes(ilist):
    temp_list = [] # initially, empty temporary list
    dupe_list = [] # initially, empty duplicate list
    for each in ilist:
        if each in temp_list: # Found a Duplicate element
            if not each in dupe_list: # Avoid duplicate elements in dupe_list
                dupe_list.append(each) # Add duplicate element to dupe_list
        else: 
            temp_list.append(each) # Add a new (non-duplicate) to temp_list

    return dupe_list

ব্যাখ্যা: এখানে আমরা দুটি খালি তালিকা তৈরি করে শুরু করব। তারপরে তালিকার সমস্ত উপাদানগুলির মধ্যে নজরদারি চালিয়ে যান, এটি অস্থায়ী তালিকায় বিদ্যমান কিনা তা দেখতে (প্রাথমিকভাবে খালি)। যদি এটি টেম্পলিস্টে না থাকে, তবে আমরা এটি সংযোজন পদ্ধতিটি ব্যবহার করে টেম্পলিস্টে যুক্ত করব

এটি আগে থেকেই temp_list বিদ্যমান থাকেন তার মানে, যে তালিকার বর্তমান উপাদান সদৃশ, তাই আমরা এটি যোগ করতে ব্যবহার dupe_list প্রয়োজন পরিশেষে যোগ পদ্ধতি।


2
raw_list = [1,2,3,3,4,5,6,6,7,2,3,4,2,3,4,1,3,4,]

clean_list = list(set(raw_list))
duplicated_items = []

for item in raw_list:
    try:
        clean_list.remove(item)
    except ValueError:
        duplicated_items.append(item)


print(duplicated_items)
# [3, 6, 2, 3, 4, 2, 3, 4, 1, 3, 4]

আপনি মূলত সেট ( clean_list) তে রূপান্তর করে সদৃশগুলি সরিয়ে ফেলুন , তারপরে পুনরাবৃত্তি করুন raw_list, এবং প্রতিটি itemঘটনাস্থলের জন্য পরিষ্কার তালিকায় সরানোর সময় raw_list। যদি itemপাওয়া না যায় তবে উত্থাপিত ValueErrorব্যতিক্রম ধরা পড়ে এবং এতে itemযুক্ত হয়duplicated_items তালিকাতে ।

যদি সদৃশ আইটেমের সূচকের প্রয়োজন হয়, কেবল enumerateতালিকাটি তৈরি করুন এবং সূচকটি নিয়ে ঘুরে দেখুন। ( for index, item in enumerate(raw_list):) যা দ্রুত এবং বৃহত তালিকার জন্য অনুকূলিত হয় (হাজার হাজার উপাদানগুলির মতো)


2

list.count()প্রদত্ত তালিকার সদৃশ উপাদানগুলি সনাক্ত করতে তালিকায় পদ্ধতির ব্যবহার

arr=[]
dup =[]
for i in range(int(input("Enter range of list: "))):
    arr.append(int(input("Enter Element in a list: ")))
for i in arr:
    if arr.count(i)>1 and i not in dup:
        dup.append(i)
print(dup)

গণনা ফাংশনটি ব্যবহার করে তালিকায় নকল উপাদানগুলি খুঁজে পাওয়ার সহজ উপায়
রবিকিরণ ডি

2

এক-লাইনার, মজাদার জন্য এবং যেখানে একটি একক বিবৃতি প্রয়োজন।

(lambda iterable: reduce(lambda (uniq, dup), item: (uniq, dup | {item}) if item in uniq else (uniq | {item}, dup), iterable, (set(), set())))(some_iterable)


1

একটি লাইন সমাধান:

set([i for i in list if sum([1 for a in list if a == i]) > 1])

1

এখানে অনেকগুলি উত্তর রয়েছে তবে আমি মনে করি এটি তুলনামূলকভাবে খুব পঠনযোগ্য এবং সহজে বোঝার পদ্ধতির:

def get_duplicates(sorted_list):
    duplicates = []
    last = sorted_list[0]
    for x in sorted_list[1:]:
        if x == last:
            duplicates.append(x)
        last = x
    return set(duplicates)

মন্তব্য:

  • আপনি যদি সদৃশ গণনা সংরক্ষণ করতে চান তবে পুরো তালিকাটি পেতে কাস্ট থেকে নীচের দিকে 'সেট' করুন
  • আপনি জেনারেটর ব্যবহার করতে পছন্দ করেন, প্রতিস্থাপন (x) এর duplicates.append সঙ্গে ফলন এক্স এবং বিনিময়ে বিবৃতি নীচে (আপনি পরে সেট করতে নিক্ষেপ করতে পারেন)

1

এখানে একটি দ্রুত জেনারেটর যা ডুপ্লিকেট আইটেমটি ইতিমধ্যে পাওয়া গেছে কিনা তা যাচাই করার জন্য বুলিয়ান মান সহ প্রতিটি উপাদানকে কী হিসাবে সংরক্ষণ করতে ডিক ব্যবহার করে uses

সমস্ত উপাদানগুলির সাথে তালিকার জন্য যা হ্যাশযোগ্য প্রকারগুলি:

def gen_dupes(array):
    unique = {}
    for value in array:
        if value in unique and unique[value]:
            unique[value] = False
            yield value
        else:
            unique[value] = True

array = [1, 2, 2, 3, 4, 1, 5, 2, 6, 6]
print(list(gen_dupes(array)))
# => [2, 1, 6]

তালিকাগুলি থাকতে পারে এমন তালিকার জন্য:

def gen_dupes(array):
    unique = {}
    for value in array:
        is_list = False
        if type(value) is list:
            value = tuple(value)
            is_list = True

        if value in unique and unique[value]:
            unique[value] = False
            if is_list:
                value = list(value)

            yield value
        else:
            unique[value] = True

array = [1, 2, 2, [1, 2], 3, 4, [1, 2], 5, 2, 6, 6]
print(list(gen_dupes(array)))
# => [2, [1, 2], 6]

1
def removeduplicates(a):
  seen = set()

  for i in a:
    if i not in seen:
      seen.add(i)
  return seen 

print(removeduplicates([1,1,2,2]))

আপনি অনুরোধ হিসাবে একটি তালিকা নয় একটি সেট ফেরত দিন। একটি সেট শুধুমাত্র অনন্য উপাদান রয়েছে, সুতরাং যদি বিবৃতি সত্যই প্রয়োজনীয় নয়। আপনার সমাধানটি অন্যের তুলনায় কী কী সুবিধা তা বোঝাতে হবে।
Clemens


0

এই উপায়টি আমাকে এইভাবেই করতে হয়েছিল কারণ আমি নিজেকে অন্য পদ্ধতি ব্যবহার না করার জন্য চ্যালেঞ্জ জানিয়েছিলাম:

def dupList(oldlist):
    if type(oldlist)==type((2,2)):
        oldlist=[x for x in oldlist]
    newList=[]
    newList=newList+oldlist
    oldlist=oldlist
    forbidden=[]
    checkPoint=0
    for i in range(len(oldlist)):
        #print 'start i', i
        if i in forbidden:
            continue
        else:
            for j in range(len(oldlist)):
                #print 'start j', j
                if j in forbidden:
                    continue
                else:
                    #print 'after Else'
                    if i!=j: 
                        #print 'i,j', i,j
                        #print oldlist
                        #print newList
                        if oldlist[j]==oldlist[i]:
                            #print 'oldlist[i],oldlist[j]', oldlist[i],oldlist[j]
                            forbidden.append(j)
                            #print 'forbidden', forbidden
                            del newList[j-checkPoint]
                            #print newList
                            checkPoint=checkPoint+1
    return newList

সুতরাং আপনার নমুনা হিসাবে কাজ করে:

>>>a = [1,2,3,3,3,4,5,6,6,7]
>>>dupList(a)
[1, 2, 3, 4, 5, 6, 7]

3
ওপি যা চেয়েছিল তা নয়। তিনি সদৃশদের একটি তালিকা চেয়েছিলেন, নকল মুছে ফেলা সমেত একটি তালিকা নয়। নকল মুছে ফেলা দিয়ে একটি তালিকা তৈরি করতে, আমি পরামর্শ দেব duplist = list(set(a))
জোন্ডো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.