ফ্ল্যাট তালিকায় নকল আছে কিনা তা আমি কীভাবে পরীক্ষা করব?


184

উদাহরণস্বরূপ, তালিকাটি দেওয়া হয়েছে ['one', 'two', 'one'], অ্যালগরিদমটি ফিরে আসবে True, যেখানে দেওয়া হয়েছে ['one', 'two', 'three']এটি ফিরে আসবে False

উত্তর:


397

set()সমস্ত মান হ্যাশযোগ্য হলে সদৃশ অপসারণ করতে ব্যবহার করুন :

>>> your_list = ['one', 'two', 'one']
>>> len(your_list) != len(set(your_list))
True

17
এটি পড়ার আগে আমি আপনার_লিস্টটি চেষ্টা করেছিলাম! = তালিকা (সেট (আপনার_লিস্ট)) যা উপাদানগুলির ক্রম পরিবর্তন হবে না বলে কাজ করবে না। লেন ব্যবহার করা এই সমস্যাটি সমাধান করার একটি ভাল উপায়

1
প্রায়শই ভাসমান পয়েন্টগুলির অ্যারের জন্য কাজ করে না st দেখুন স্ট্যাকওভারফ্লো. com
মানস ডোগরা

54

কেবল সংক্ষিপ্ত তালিকার জন্য প্রস্তাবিত :

any(thelist.count(x) > 1 for x in thelist)

দীর্ঘ তালিকায় ব্যবহার করবেন না - তালিকার আইটেমের সংখ্যার বর্গক্ষেত্রের সাথে সমানুপাতিক সময় লাগতে পারে !

হ্যাশযোগ্য আইটেম (স্ট্রিং, সংখ্যা এবং সি) সহ দীর্ঘ তালিকার জন্য:

def anydup(thelist):
  seen = set()
  for x in thelist:
    if x in seen: return True
    seen.add(x)
  return False

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


21
ডেনিস ওটকিডাচ এমন একটি সমাধানের প্রস্তাব দেয় যেখানে আপনি কেবল তালিকা থেকে একটি নতুন সেট তৈরি করেন, তার দৈর্ঘ্যটি পরীক্ষা করুন। এর সুবিধাটি হ'ল এটি পাইথনের অভ্যন্তরীণ সি কোডটিকে ভারী উত্তোলন করতে দিচ্ছে। পাইথন কোডে আপনার সমাধানটি লুপ হয় তবে একটি একক মিল খুঁজে পাওয়া গেলে শর্ট সার্কিটের সুবিধা রয়েছে। মতবিরোধগুলি যদি হয় যে তালিকার সম্ভবত কোনও নকল নেই, তবে আমি ডেনিস ওটকিডাচের সংস্করণটি পছন্দ করি, তবে যদি প্রতিক্রিয়াগুলি হয় তবে তালিকার প্রথমদিকে কোনও সদৃশ থাকতে পারে তবে এই সমাধানটি আরও ভাল।
স্টিভাহ

1
ডেনিসের নিকটতম সমাধান রয়েছে বলে আমি মনে করি, তবুও বিশদটি মূল্যবান।
স্টিভ 314

@ স্টেভেহা - অকাল অপটিমাইজেশন?
স্টিভ 314

@ স্টিভ 314, অকাল অনুকূলতা কী? ডেনিস ওটকিডাচ এটি যেভাবে লিখেছিল আমি তা লিখতে পারি, তাই আমি বুঝতে চেষ্টা করছিলাম যে অ্যালেক্স মার্তেলি (পাইথন কুকবুক খ্যাতির) কেন এটি অন্যভাবে লিখেছিলেন। আমি এটি সম্পর্কে কিছুটা চিন্তা করার পরে আমি বুঝতে পারি যে অ্যালেক্সের সংস্করণ শর্ট সার্কিট, এবং আমি পার্থক্যগুলি সম্পর্কে কয়েকটি চিন্তা পোস্ট করেছি। সমস্ত অশুভের গোড়া থেকে অকাল অপটিমাইজেশনের পার্থক্যের আলোচনা থেকে আপনি কীভাবে যেতে পারেন?
স্টিভাহ

3
যদি আইটেমগুলি হ্যাশযোগ্য হয় তবে একটি সেট সমাধান আরও সরাসরি হয় এবং আমি যেভাবে এটি প্রকাশ করেছি তাড়াতাড়ি (উত্তরটি জানা যাওয়ার সাথে সাথেই বেরিয়ে আসে - "শর্ট সার্কিট", স্টিভাহা এটি রেখে দিন)। আপনার প্রস্তাবিত ডিকটি তৈরি করা (সংগ্রহ হিসাবে দ্রুততম .াকা.উত্তর) অবশ্যই অবশ্যই অনেক ধীর গতির ( allসকলের 1 হিসাবে একটি সংখ্যা প্রয়োজন )। সমস্ত মান সহ একটি ডিক সত্য, যা আপনিও উল্লেখ করেছেন, এটি একটি হাস্যকর, অকেজো ফুলের মিমিক্রি set, যার কোনও অতিরিক্ত মূল্য নেই। বিগ-ও প্রোগ্রামিংয়ের সবকিছু নয়।
অ্যালেক্স মার্টেলি

12

এটি পুরানো তবে এখানে উত্তরগুলি আমাকে কিছুটা আলাদা সমাধানে নিয়ে গেছে। আপনি যদি বোধগম্যতা আপত্তিজনক ব্যবহারের জন্য প্রস্তুত থাকেন তবে আপনি এভাবে শর্ট সার্কিট করতে পারেন।

xs = [1, 2, 1]
s = set()
any(x in s or s.add(x) for x in xs)
# You can use a similar approach to actually retrieve the duplicates.
s = set()
duplicates = set(x for x in xs if x in s or s.add(x))

9

আপনি কার্যকরী প্রোগ্রামিং শৈলী অনুরাগী হন, এখানে একটি দরকারী ফাংশন, স্ব-নথিভুক্ত এবং ব্যবহার কোড পরীক্ষিত হয় doctest

def decompose(a_list):
    """Turns a list into a set of all elements and a set of duplicated elements.

    Returns a pair of sets. The first one contains elements
    that are found at least once in the list. The second one
    contains elements that appear more than once.

    >>> decompose([1,2,3,5,3,2,6])
    (set([1, 2, 3, 5, 6]), set([2, 3]))
    """
    return reduce(
        lambda (u, d), o : (u.union([o]), d.union(u.intersection([o]))),
        a_list,
        (set(), set()))

if __name__ == "__main__":
    import doctest
    doctest.testmod()

সেখান থেকে আপনি ফিরে আসা জোড়ার দ্বিতীয় উপাদানটি খালি কিনা তা পরীক্ষা করে ইউনিটিসিটি পরীক্ষা করতে পারেন:

def is_set(l):
    """Test if there is no duplicate element in l.

    >>> is_set([1,2,3])
    True
    >>> is_set([1,2,1])
    False
    >>> is_set([])
    True
    """
    return not decompose(l)[1]

নোট করুন যেহেতু আপনি স্পষ্টভাবে পচাটি তৈরি করছেন এটি কার্যকর নয়। তবে হ্রাস ব্যবহারের লাইনের সাথে আপনি 5 টির উত্তর দিতে সমতুল্য কিছু (তবে কিছুটা কম দক্ষ) আসতে পারেন:

def is_set(l):
    try:
        def func(s, o):
            if o in s:
                raise Exception
            return s.union([o])
        reduce(func, l, set())
        return True
    except:
        return False

প্রথমে সম্পর্কিত প্রশ্নগুলি পড়া উচিত ছিল। এই বর্ণনা করা হয়েছে stackoverflow.com/questions/1723072/...
জেভিয়ার Decoret

1
এটি আমাকে পচে যাওয়া () -এর
ল্যাম্বদা

এর কারণ ল্যাম্বদা আর্গুমেন্ট তালিকাগুলি আনপ্যাক করা পাইথন ৩.x এ সরানো হয়েছে।
এমসিফার্ট

5

আমি ভেবেছিলাম এখানে উপস্থাপিত বিভিন্ন সমাধানের সময়গুলির তুলনা করা কার্যকর হবে। এর জন্য আমি আমার নিজস্ব লাইব্রেরি ব্যবহার করেছি simple_benchmark:

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

তাই প্রকৃতপক্ষে এই ক্ষেত্রে সমাধান ডেনিস ওটকিডাচ থেকে দ্রুততম।

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

এবং নকলটি প্রথম অবস্থানে থাকলে। কোন সমাধানগুলি শর্ট সার্কিট করছে তা দেখতে এটি দরকারী:

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

এখানে বেশ কয়েকটি পদ্ধতির শর্ট সার্কিট নেই: কাইকু, ফ্রাঙ্ক, জাভিয়ের_ ডেকোরেট (প্রথম সমাধান), টার্ন, অ্যালেক্স মার্টেলি (প্রথম সমাধান) এবং ডেনিস ওটকিডাচের উপস্থাপিত পদ্ধতি (যা নো-ডুপ্লিকেট ক্ষেত্রে দ্রুততম ছিল)।

আমি এখানে আমার নিজস্ব গ্রন্থাগার থেকে একটি ফাংশন অন্তর্ভুক্ত করেছি: iteration_utilities.all_distinct যা নন-অনুলিপি ক্ষেত্রে দ্রুততম সমাধানের সাথে প্রতিযোগিতা করতে পারে এবং নকল-এ-শুরুর ক্ষেত্রে (যদিও সবচেয়ে দ্রুত নয়) জন্য ধ্রুবক সময়ে সঞ্চালন করতে পারে।

মানদণ্ডের জন্য কোড:

from collections import Counter
from functools import reduce

import pandas as pd
from simple_benchmark import BenchmarkBuilder
from iteration_utilities import all_distinct

b = BenchmarkBuilder()

@b.add_function()
def Keiku(l):
    return pd.Series(l).duplicated().sum() > 0

@b.add_function()
def Frank(num_list):
    unique = []
    dupes = []
    for i in num_list:
        if i not in unique:
            unique.append(i)
        else:
            dupes.append(i)
    if len(dupes) != 0:
        return False
    else:
        return True

@b.add_function()
def wjandrea(iterable):
    seen = []
    for x in iterable:
        if x in seen:
            return True
        seen.append(x)
    return False

@b.add_function()
def user(iterable):
    clean_elements_set = set()
    clean_elements_set_add = clean_elements_set.add

    for possible_duplicate_element in iterable:

        if possible_duplicate_element in clean_elements_set:
            return True

        else:
            clean_elements_set_add( possible_duplicate_element )

    return False

@b.add_function()
def Turn(l):
    return Counter(l).most_common()[0][1] > 1

def getDupes(l):
    seen = set()
    seen_add = seen.add
    for x in l:
        if x in seen or seen_add(x):
            yield x

@b.add_function()          
def F1Rumors(l):
    try:
        if next(getDupes(l)): return True    # Found a dupe
    except StopIteration:
        pass
    return False

def decompose(a_list):
    return reduce(
        lambda u, o : (u[0].union([o]), u[1].union(u[0].intersection([o]))),
        a_list,
        (set(), set()))

@b.add_function()
def Xavier_Decoret_1(l):
    return not decompose(l)[1]

@b.add_function()
def Xavier_Decoret_2(l):
    try:
        def func(s, o):
            if o in s:
                raise Exception
            return s.union([o])
        reduce(func, l, set())
        return True
    except:
        return False

@b.add_function()
def pyrospade(xs):
    s = set()
    return any(x in s or s.add(x) for x in xs)

@b.add_function()
def Alex_Martelli_1(thelist):
    return any(thelist.count(x) > 1 for x in thelist)

@b.add_function()
def Alex_Martelli_2(thelist):
    seen = set()
    for x in thelist:
        if x in seen: return True
        seen.add(x)
    return False

@b.add_function()
def Denis_Otkidach(your_list):
    return len(your_list) != len(set(your_list))

@b.add_function()
def MSeifert04(l):
    return not all_distinct(l)

এবং যুক্তিগুলির জন্য:


# No duplicate run
@b.add_arguments('list size')
def arguments():
    for exp in range(2, 14):
        size = 2**exp
        yield size, list(range(size))

# Duplicate at beginning run
@b.add_arguments('list size')
def arguments():
    for exp in range(2, 14):
        size = 2**exp
        yield size, [0, *list(range(size)]

# Running and plotting
r = b.run()
r.plot()

রেফারেন্সের জন্য: all_distinct ফাংশন সি তে লেখা হয়
ব্যবহারকারী

5

আমি সমস্ত নকল স্থাপন করতে সম্প্রতি সম্পর্কিত একটি প্রশ্নের উত্তর দিয়েছিএকটি জেনারেটর ব্যবহার করে তালিকায় । এটির সুবিধা রয়েছে যে যদি 'যদি সেখানে একটি সদৃশ থাকে তবে' স্থাপন করতে ব্যবহার করা হয় তবে আপনার কেবল প্রথম আইটেমটি পাওয়া উচিত এবং বাকিগুলি উপেক্ষা করা যেতে পারে, এটি চূড়ান্ত শর্টকাট।

এটি একটি মজাদার সেট ভিত্তিক পদ্ধতি যা আমি মুওইপি থেকে সরাসরি গ্রহণ করেছি :

def getDupes(l):
    seen = set()
    seen_add = seen.add
    for x in l:
        if x in seen or seen_add(x):
            yield x

তদনুসারে, dupes একটি সম্পূর্ণ তালিকা হবে list(getDupes(etc))। কেবলমাত্র "যদি" এখানে কোনও ডুপ রয়েছে তা পরীক্ষা করার জন্য, এটি নীচে মোড়ানো উচিত:

def hasDupes(l):
    try:
        if getDupes(l).next(): return True    # Found a dupe
    except StopIteration:
        pass
    return False

এটি স্কেলগুলি ভাল করে এবং ডুপের তালিকায় যেখানেই থাকুক না কেন সামঞ্জস্যপূর্ণ অপারেটিং সময় সরবরাহ করে - আমি 1 মিটার পর্যন্ত এন্ট্রিগুলির তালিকা দিয়ে পরীক্ষা করেছি। যদি আপনি বিশেষভাবে ডেটা সম্পর্কে কিছু জানেন তবে সম্ভবত যে দ্বিধাটি প্রথমার্ধে প্রদর্শিত হবে বা অন্যান্য জিনিস যা আপনাকে আপনার প্রয়োজনীয়তাগুলি স্যাঙ্ক করতে দেয় যেমন আসল ডুপস পাওয়ার প্রয়োজন হয়, তারপরে সেখানে সত্যিকারের বিকল্প ডুপ লোকেশনগুলির কয়েকটি রয়েছে are যে outperfor হতে পারে। আমি দু'জনের পরামর্শ দিচ্ছি ...

সাধারণ ডিক্ট ভিত্তিক পদ্ধতি, খুব পাঠযোগ্য:

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

বাছাই করা তালিকায় লিভারেজ ইটারটুলগুলি (মূলত একটি আইফিল্টার / আইজিআইপি / টি), খুব দক্ষ যদি আপনি সমস্ত ডুপ পেয়ে থাকেন তবে প্রথমটি পাওয়ার জন্য তত দ্রুত নয়:

def getDupes(c):
    a, b = itertools.tee(sorted(c))
    next(b, None)
    r = None
    for k, g in itertools.ifilter(lambda x: x[0]==x[1], itertools.izip(a, b)):
        if k != r:
            yield k
            r = k

আমি পুরো দ্বৈত তালিকার জন্য চেষ্টা করেছি এমন পদ্ধতির শীর্ষস্থানীয় অভিনয়কারীরা , প্রথম দুপটি শুরু থেকে মাঝখানে 1 মি এলিমেন্ট তালিকার যে কোনও জায়গায় ঘটেছিল। এটি অবাক করে দিয়েছিল যে কীভাবে সামান্য ধাপে সাজানো পদক্ষেপটি যুক্ত হয়েছিল। আপনার মাইলেজ পরিবর্তিত হতে পারে, তবে এখানে আমার নির্দিষ্ট সময়সীমা ফলাফল রয়েছে:

Finding FIRST duplicate, single dupe places "n" elements in to 1m element array

Test set len change :        50 -  . . . . .  -- 0.002
Test in dict        :        50 -  . . . . .  -- 0.002
Test in set         :        50 -  . . . . .  -- 0.002
Test sort/adjacent  :        50 -  . . . . .  -- 0.023
Test sort/groupby   :        50 -  . . . . .  -- 0.026
Test sort/zip       :        50 -  . . . . .  -- 1.102
Test sort/izip      :        50 -  . . . . .  -- 0.035
Test sort/tee/izip  :        50 -  . . . . .  -- 0.024
Test moooeeeep      :        50 -  . . . . .  -- 0.001 *
Test iter*/sorted   :        50 -  . . . . .  -- 0.027

Test set len change :      5000 -  . . . . .  -- 0.017
Test in dict        :      5000 -  . . . . .  -- 0.003 *
Test in set         :      5000 -  . . . . .  -- 0.004
Test sort/adjacent  :      5000 -  . . . . .  -- 0.031
Test sort/groupby   :      5000 -  . . . . .  -- 0.035
Test sort/zip       :      5000 -  . . . . .  -- 1.080
Test sort/izip      :      5000 -  . . . . .  -- 0.043
Test sort/tee/izip  :      5000 -  . . . . .  -- 0.031
Test moooeeeep      :      5000 -  . . . . .  -- 0.003 *
Test iter*/sorted   :      5000 -  . . . . .  -- 0.031

Test set len change :     50000 -  . . . . .  -- 0.035
Test in dict        :     50000 -  . . . . .  -- 0.023
Test in set         :     50000 -  . . . . .  -- 0.023
Test sort/adjacent  :     50000 -  . . . . .  -- 0.036
Test sort/groupby   :     50000 -  . . . . .  -- 0.134
Test sort/zip       :     50000 -  . . . . .  -- 1.121
Test sort/izip      :     50000 -  . . . . .  -- 0.054
Test sort/tee/izip  :     50000 -  . . . . .  -- 0.045
Test moooeeeep      :     50000 -  . . . . .  -- 0.019 *
Test iter*/sorted   :     50000 -  . . . . .  -- 0.055

Test set len change :    500000 -  . . . . .  -- 0.249
Test in dict        :    500000 -  . . . . .  -- 0.145
Test in set         :    500000 -  . . . . .  -- 0.165
Test sort/adjacent  :    500000 -  . . . . .  -- 0.139
Test sort/groupby   :    500000 -  . . . . .  -- 1.138
Test sort/zip       :    500000 -  . . . . .  -- 1.159
Test sort/izip      :    500000 -  . . . . .  -- 0.126
Test sort/tee/izip  :    500000 -  . . . . .  -- 0.120 *
Test moooeeeep      :    500000 -  . . . . .  -- 0.131
Test iter*/sorted   :    500000 -  . . . . .  -- 0.157

.next()আপনার দ্বিতীয় কোড ব্লক কল পাইথন 3.x. কাজ করে না আমি মনে করি next(getDupes(l))পাইথন সংস্করণ জুড়ে কাজ করা উচিত, যাতে এটি পরিবর্তন করা বোধগম্য হতে পারে।
এমসিফার্ট

এছাড়াও ifilterএবং ìzipকেবল বিল্ট-ইন দ্বারা প্রতিস্থাপিত হতে পারে filterএবং zipপাইথন 3.x. মধ্যে
এমসিফার্ট

@ সাইফার্ট সমাধানটি লিথান হিসাবে পাইথন ২.x এর জন্য কাজ করে এবং হ্যাঁ, পাই 3 এর জন্য আপনি সরাসরি ফিল্টার এবং মানচিত্র ব্যবহার করতে পারেন ... তবে পাই 2 কোড বেসে পাই 3 সমাধানটি কেউ উপকার পাবেন না কারণ এটি একটি হিসাবে কাজ করে না জেনারেটরের। স্পষ্টত এই ক্ষেত্রে
জড়িত

3

সংক্ষিপ্তভাবে এটি করার আরেকটি উপায় হ'ল কাউন্টার সহ

মূল তালিকায় কোনও নকল আছে কিনা তা নির্ধারণ করতে:

from collections import Counter

def has_dupes(l):
    # second element of the tuple has number of repetitions
    return Counter(l).most_common()[0][1] > 1

অথবা নকল রয়েছে এমন আইটেমগুলির একটি তালিকা পেতে:

def get_dupes(l):
    return [k for k, v in Counter(l).items() if v > 1]

2
my_list = ['one', 'two', 'one']

duplicates = []

for value in my_list:
  if my_list.count(value) > 1:
    if value not in duplicates:
      duplicates.append(value)

print(duplicates) //["one"]

1

আমি এটি সেরা পারফরম্যান্স করতে পেলাম কারণ এটি অপারেশনকে শর্ট সার্কিট করে যখন এটি প্রথম নকল হয়েছিল, তখন এই অ্যালগরিদমের সময় এবং স্থান জটিলতা রয়েছে O (n) যেখানে n তালিকাটির দৈর্ঘ্য:

def has_duplicated_elements(iterable):
    """ Given an `iterable`, return True if there are duplicated entries. """
    clean_elements_set = set()
    clean_elements_set_add = clean_elements_set.add

    for possible_duplicate_element in iterable:

        if possible_duplicate_element in clean_elements_set:
            return True

        else:
            clean_elements_set_add( possible_duplicate_element )

    return False

0

পর্দার আড়ালে কী সেট সেট করে তা আমি সত্যিই জানি না, তাই আমি এটি সহজ রাখতে চাই।

def dupes(num_list):
    unique = []
    dupes = []
    for i in num_list:
        if i not in unique:
            unique.append(i)
        else:
            dupes.append(i)
    if len(dupes) != 0:
        return False
    else:
        return True

0

আরও একটি সহজ সমাধান নিম্নরূপ: পান্ডাস .duplicated()পদ্ধতিতে কেবল সত্য / মিথ্যা পরীক্ষা করুন এবং তারপরে যোগফল নিন। দয়া করে পান্ডাসও দেখুন eries

import pandas as pd

def has_duplicated(l):
    return pd.Series(l).duplicated().sum() > 0

print(has_duplicated(['one', 'two', 'one']))
# True
print(has_duplicated(['one', 'two', 'three']))
# False

0

যদি তালিকায় অপ্রয়োজনীয় আইটেম থাকে, আপনি অ্যালেক্স মার্তেলির সমাধানটি ব্যবহার করতে পারেন তবে একটি সেটের পরিবর্তে একটি তালিকা সহ, যদিও এটি বড় ইনপুটগুলির জন্য ধীর: O (N ^ 2)।

def has_duplicates(iterable):
    seen = []
    for x in iterable:
        if x in seen:
            return True
        seen.append(x)
    return False

0

আমি পাইরোস্প্যাডের পদ্ধতিকে তার সরলতার জন্য ব্যবহার করেছি এবং কেস-সংবেদনশীল উইন্ডোজ রেজিস্ট্রি থেকে তৈরি একটি সংক্ষিপ্ত তালিকায় কিছুটা পরিবর্তন করেছি।

যদি কাঁচা PATH মানের স্ট্রিংটি পৃথক পাথে বিভক্ত হয় তবে সমস্ত 'নাল' পাথ (খালি বা শ্বেতস্থান কেবল স্ট্রিং) ব্যবহার করে মুছে ফেলা যাবে:

PATH_nonulls = [s for s in PATH if s.strip()]

def HasDupes(aseq) :
    s = set()
    return any(((x.lower() in s) or s.add(x.lower())) for x in aseq)

def GetDupes(aseq) :
    s = set()
    return set(x for x in aseq if ((x.lower() in s) or s.add(x.lower())))

def DelDupes(aseq) :
    seen = set()
    return [x for x in aseq if (x.lower() not in seen) and (not seen.add(x.lower()))]

মূল PATH পরীক্ষার উদ্দেশ্যে 'নাল' এন্ট্রি এবং সদৃশ উভয়ই রয়েছে:

[list]  Root paths in HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH[list]  Root paths in HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
  1  C:\Python37\
  2
  3
  4  C:\Python37\Scripts\
  5  c:\python37\
  6  C:\Program Files\ImageMagick-7.0.8-Q8
  7  C:\Program Files (x86)\poppler\bin
  8  D:\DATA\Sounds
  9  C:\Program Files (x86)\GnuWin32\bin
 10  C:\Program Files (x86)\Intel\iCLS Client\
 11  C:\Program Files\Intel\iCLS Client\
 12  D:\DATA\CCMD\FF
 13  D:\DATA\CCMD
 14  D:\DATA\UTIL
 15  C:\
 16  D:\DATA\UHELP
 17  %SystemRoot%\system32
 18
 19
 20  D:\DATA\CCMD\FF%SystemRoot%
 21  D:\DATA\Sounds
 22  %SystemRoot%\System32\Wbem
 23  D:\DATA\CCMD\FF
 24
 25
 26  c:\
 27  %SYSTEMROOT%\System32\WindowsPowerShell\v1.0\
 28

নাল পাথগুলি সরানো হয়েছে, তবে এখনও নকল রয়েছে, যেমন, (1, 3) এবং (13, 20):

    [list]  Null paths removed from HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH
  1  C:\Python37\
  2  C:\Python37\Scripts\
  3  c:\python37\
  4  C:\Program Files\ImageMagick-7.0.8-Q8
  5  C:\Program Files (x86)\poppler\bin
  6  D:\DATA\Sounds
  7  C:\Program Files (x86)\GnuWin32\bin
  8  C:\Program Files (x86)\Intel\iCLS Client\
  9  C:\Program Files\Intel\iCLS Client\
 10  D:\DATA\CCMD\FF
 11  D:\DATA\CCMD
 12  D:\DATA\UTIL
 13  C:\
 14  D:\DATA\UHELP
 15  %SystemRoot%\system32
 16  D:\DATA\CCMD\FF%SystemRoot%
 17  D:\DATA\Sounds
 18  %SystemRoot%\System32\Wbem
 19  D:\DATA\CCMD\FF
 20  c:\
 21  %SYSTEMROOT%\System32\WindowsPowerShell\v1.0\

এবং অবশেষে, দুপগুলি সরানো হয়েছে:

[list]  Massaged path list from in HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH
  1  C:\Python37\
  2  C:\Python37\Scripts\
  3  C:\Program Files\ImageMagick-7.0.8-Q8
  4  C:\Program Files (x86)\poppler\bin
  5  D:\DATA\Sounds
  6  C:\Program Files (x86)\GnuWin32\bin
  7  C:\Program Files (x86)\Intel\iCLS Client\
  8  C:\Program Files\Intel\iCLS Client\
  9  D:\DATA\CCMD\FF
 10  D:\DATA\CCMD
 11  D:\DATA\UTIL
 12  C:\
 13  D:\DATA\UHELP
 14  %SystemRoot%\system32
 15  D:\DATA\CCMD\FF%SystemRoot%
 16  %SystemRoot%\System32\Wbem
 17  %SYSTEMROOT%\System32\WindowsPowerShell\v1.0\

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