তালিকার সমস্ত উপাদান অনন্য কিনা তা পরীক্ষা করা হচ্ছে


104

তালিকার সমস্ত উপাদান অনন্য কিনা তা যাচাই করার সর্বোত্তম উপায় (প্রচলিত পদ্ধতিতে সেরা) কী?

আমার বর্তমান ব্যবহারটি Counterহ'ল:

>>> x = [1, 1, 1, 2, 3, 4, 5, 6, 2]
>>> counter = Counter(x)
>>> for values in counter.itervalues():
        if values > 1: 
            # do something

আমি কি আরও ভাল করতে পারি?

উত্তর:


164

সবচেয়ে দক্ষ নয়, তবে সোজা এগিয়ে এবং সংক্ষিপ্ত:

if len(x) > len(set(x)):
   pass # do something

সংক্ষিপ্ত তালিকার পক্ষে সম্ভবত খুব বেশি পার্থক্য তৈরি হবে না।


এটি আমি পাশাপাশি করি। যদিও বড় তালিকাগুলির জন্য সম্ভবত দক্ষ নয়।
টেকারউইন

অগত্যা নয় যে তালিকায় পুনরাবৃত্তি করার উপাদানগুলি রয়েছে (উদাহরণে "# কিছু") শর্তসাপেক্ষ শরীরে কার্যকর করবে the
ইয়ান

2
যথেষ্ট ভাল, ভাল সমাধান। আমি সবে <500 উপাদান পরিচালনা করছি, তাই এটি যা চাই তা করা উচিত।
ব্যবহারকারী225312

4
দীর্ঘ তালিকাগুলি সহ দক্ষতা সম্পর্কে যারা চিন্তিত তাদের জন্য এটি হল দীর্ঘ তালিকা যা আসলে অনন্য (যেখানে সব উপাদান পরীক্ষণ প্রয়োজন) জন্য দক্ষ। প্রারম্ভিক প্রস্থান সমাধানগুলি আসলে অনন্য তালিকার জন্য বেশি সময় নেয় (আমার পরীক্ষাগুলিতে প্রায় 2x দীর্ঘ) rough সুতরাং ... আপনি যদি আপনার বেশিরভাগ তালিকার অনন্যতার প্রত্যাশা করেন তবে এই সাধারণ সেট দৈর্ঘ্যের চেকিং সমাধানটি ব্যবহার করুন। আপনি যদি আশা করেন যে আপনার বেশিরভাগ তালিকা অনন্য নয়, তবে প্রারম্ভিক প্রস্থান সমাধানটি ব্যবহার করুন। কোনটি ব্যবহার করবেন তা আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে।
রাশ

এই উত্তরটি দুর্দান্ত। তবে, এখানে সাবধানতা অবলম্বন করা উচিত:len(x) > len(set(x)) উপাদানগুলি xঅনন্য না হলে সত্য । এই প্রশ্নের শিরোনামটি ঠিক এর বিপরীতে জিজ্ঞাসা করে: "তালিকার সমস্ত উপাদান অনন্য কিনা তা পরীক্ষা করা হচ্ছে "
কেন

96

এখানে একটি দ্বি-লাইনার যা প্রারম্ভিক প্রস্থানও করবে:

>>> def allUnique(x):
...     seen = set()
...     return not any(i in seen or seen.add(i) for i in x)
...
>>> allUnique("ABCDEF")
True
>>> allUnique("ABACDEF")
False

যদি x এর উপাদানগুলি হ্যাশযোগ্য না হয়, তবে আপনাকে এর জন্য একটি তালিকা ব্যবহার করে অবলম্বন করতে হবে seen:

>>> def allUnique(x):
...     seen = list()
...     return not any(i in seen or seen.append(i) for i in x)
...
>>> allUnique([list("ABC"), list("DEF")])
True
>>> allUnique([list("ABC"), list("DEF"), list("ABC")])
False

5
প্রয়োজন না হলে +1 পরিষ্কার করে পুরো তালিকা দিয়ে পুনরাবৃত্তি করে না।
Kos

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

আমি এমআইটি লাইসেন্স ব্যবহার করে অন্যান্য কোড রেখেছি, যাতে এই স্নিপেটের জন্য এটি আমার পক্ষে কাজ করে। আমার বিশেষ কিছু করার দরকার?
PaulMcG

21

একটি প্রারম্ভিক-প্রস্থান সমাধান হতে পারে

def unique_values(g):
    s = set()
    for x in g:
        if x in s: return False
        s.add(x)
    return True

তবে ছোট মামলার ক্ষেত্রে বা যদি প্রারম্ভিক-উত্সাহ পাওয়া সাধারণ ঘটনা না হয় তবে আমি len(x) != len(set(x))দ্রুততম পদ্ধতি হওয়ার আশা করব ।


আমি অন্যান্য উত্তরটি গ্রহণ করেছি কারণ আমি বিশেষত অপ্টিমাইজেশনের সন্ধান করছি না।
user225312

2
আপনি নীচের লাইনটি পরে এইটি সংক্ষিপ্ত করতে পারেন s = set()...return not any(s.add(x) if x not in s else True for x in g)
অ্যান্ড্রু ক্লার্ক

আপনি যদি ব্যাখ্যা করতে পারেন len(x) != len(set(x))যে প্রারম্ভিক-বহির্গমনটি সাধারণ না হয় তবে আপনি কেন এর চেয়ে দ্রুত হবেন আশা করবেন? উভয় অপারেশন ও (লেন (এক্স)) নয় ? ( xআসল তালিকাটি কোথায় )
ক্রিস রেডফোর্ড

ওহ, আমি দেখতে পাচ্ছি: আপনার পদ্ধতিটি ও (লেন (এক্স)) নয় কারণ আপনি লুপের জন্য ও (লেন (এক্স)) এরif x in s ভিতরে যাচাই করেন ।
ক্রিস রেডফোর্ড 12'12

15

গতির জন্য:

import numpy as np
x = [1, 1, 1, 2, 3, 4, 5, 6, 2]
np.unique(x).size == len(x)

12

একটি সেটে সমস্ত এন্ট্রি যুক্ত করা এবং এর দৈর্ঘ্য পরীক্ষা করা সম্পর্কে কীভাবে?

len(set(x)) == len(x)

1
ইয়ান পরে এক সেকেন্ড উত্তর, আউট। স্বল্প ও মধুর. কোনও কারণেই কেন এই সমাধানটি ব্যবহার করবেন না?
জেসনলনহার্ড

সমস্ত সিকোয়েন্স (বিশেষত জেনারেটর) সমর্থন করে না len()
PaulMcG

9

একটি বিকল্প set, আপনি একটি ব্যবহার করতে পারেন dict

len({}.fromkeys(x)) == len(x)

9
আমি একটি সেট উপর একটি ডিক ব্যবহার করতে একেবারে কোন সুবিধা দেখতে পাচ্ছি। অযৌক্তিকভাবে জিনিসগুলিকে জটিল করে তোলে বলে মনে হচ্ছে।
রূপকথার

3

বাছাই এবং গোষ্ঠীবিশেষ ব্যবহার করে সম্পূর্ণরূপে অন্য একটি পদ্ধতি:

from itertools import groupby
is_unique = lambda seq: all(sum(1 for _ in x[1])==1 for x in groupby(sorted(seq)))

এটি একটি বাছাই প্রয়োজন, কিন্তু প্রথম পুনরাবৃত্তি মান থেকে প্রস্থান করে।


হ্যাশিং বাছাই করার চেয়ে দ্রুত
আইসআর্ডার

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

1
যদি আপনার তালিকায় স্বেচ্ছাসেবী অবজেক্টগুলি থাকে যা বাছাইযোগ্য নয়, তবে id()কাজটি করার জন্য groupby()এটি পূর্বশর্ত হিসাবে তাদের সাজানোর জন্য আপনি ফাংশনটি ব্যবহার করতে পারেন :groupby(sorted(seq), key=id)
লার্স

3

মজাদার জন্য এখানে একটি পুনরাবৃত্তি ও (এন 2 ) সংস্করণ রয়েছে:

def is_unique(lst):
    if len(lst) > 1:
        return is_unique(s[1:]) and (s[0] not in s[1:])
    return True

2

এখানে একটি পুনরাবৃত্ত প্রারম্ভিক-প্রস্থান ফাংশন:

def distinct(L):
    if len(L) == 2:
        return L[0] != L[1]
    H = L[0]
    T = L[1:]
    if (H in T):
            return False
    else:
            return distinct(T)    

ক্রিয়ামূলক-স্টাইলের পদ্ধতির সময় অদ্ভুত (ধীর) রূপান্তরগুলি ব্যবহার না করে এটি আমার পক্ষে যথেষ্ট দ্রুত।


1
H in Tএকটি লিনিয়ার অনুসন্ধান করে এবং T = L[1:]তালিকার কাটা অংশটি অনুলিপি করে, তাই বড় তালিকায় প্রস্তাবিত অন্যান্য সমাধানের তুলনায় এটি অনেক ধীর হবে। এটি ও (এন ^ 2) আমার মনে হয়, অন্যদিকে বেশিরভাগ হ'ল ও (এন) (সেট) বা ও (এন লগ এন) (ভিত্তিক সমাধানগুলি বাছাই করা)।
ব্ল্যাকঙ্কহট

1

এই সম্পর্কে কি

def is_unique(lst):
    if not lst:
        return True
    else:
        return Counter(lst).most_common(1)[0][1]==1

0

আপনি ইয়ান সিনট্যাক্স (লেন (এক্স)> লেন (সেট (এক্স))) ব্যবহার করতে পারেন তবে সেট (এক্স) এর পরিবর্তে একটি ফাংশন সংজ্ঞায়িত করুন:

 def f5(seq, idfun=None): 
    # order preserving
    if idfun is None:
        def idfun(x): return x
    seen = {}
    result = []
    for item in seq:
        marker = idfun(item)
        # in old Python versions:
        # if seen.has_key(marker)
        # but in new ones:
        if marker in seen: continue
        seen[marker] = 1
        result.append(item)
    return result

এবং লেন (এক্স)> লেন (এফ 5 (এক্স)) করুন। এটি দ্রুত হবে এবং সংরক্ষণের আদেশও দেবে।

সেখান থেকে কোড নেওয়া হয়েছে: http://www.peterbe.com/plog/uniqifiers-benchmark


এই f5 ফাংশনটি সেটটি ব্যবহারের চেয়ে ধীর হবে যা গতির জন্য আরও অনুকূল। ব্যয়বহুল "অ্যাপেন্ড" অপারেশনের কারণে তালিকাটি বড় আকারের হয়ে গেলে এই কোডটি ভাঙতে শুরু করে। বড় তালিকা সহ x = range(1000000) + range(1000000), চলমান সেট (এক্স) f5 (এক্স) এর চেয়ে দ্রুত। অর্ডারে প্রশ্নের প্রয়োজন হয় না তবে সাজানো (সেট (এক্স)) চালানো এখনও f5 (এক্স) এর চেয়ে দ্রুত
ওকেজি ই

0

কোনও কলামের বিষয়বস্তুতে স্বতন্ত্র মান রয়েছে কিনা তা পরীক্ষা করতে একটি পান্ডাস ডেটা ফ্রেমে অনুরূপ পন্থা ব্যবহার করে:

if tempDF['var1'].size == tempDF['var1'].unique().size:
    print("Unique")
else:
    print("Not unique")

আমার জন্য, এটি মিলিয়নেরও বেশি সারি সহ একটি ডেটফ্রেমে কোনও int ভেরিয়েবলের উপর তাত্ক্ষণিক।


0

উপরের সমস্ত উত্তর ভাল তবে আমি পাইথনের ৩০ সেকেন্ডেরall_unique উদাহরণটি ব্যবহার করতে পছন্দ করি

set()সদৃশ অপসারণের জন্য আপনাকে প্রদত্ত তালিকায় ব্যবহার করতে হবে , দৈর্ঘ্যের সাথে তালিকার দৈর্ঘ্যের তুলনা করুন।

def all_unique(lst):
  return len(lst) == len(set(lst))

এটা ফেরৎ Trueযদি একটি ফ্ল্যাট তালিকাতে সকল মান unique, Falseঅন্যথায়

x = [1,2,3,4,5,6]
y = [1,2,2,3,4,5]
all_unique(x) # True
all_unique(y) # False

-3

ভিক্ষুকদের জন্য:

def AllDifferent(s):
    for i in range(len(s)):
        for i2 in range(len(s)):
            if i != i2:
                if s[i] == s[i2]:
                    return False
    return True

আমি এই উত্তরটি পছন্দ করি, কারণ এটি সেটটি ব্যবহার করার সময় আপনাকে কোন কোডটি লিখতে হবে না তা বেশ ভালভাবে দেখায়। আমি এটি "নতুনদের জন্য" লেবেল করব না, কারণ আমি বিশ্বাস করি যে নতুনদের সামনে এটি সঠিকভাবে করা শিখতে হবে; তবে আমি এমন কিছু অদক্ষ অভিজ্ঞ বিকাশকারীদের সাথে দেখা করেছি যারা অন্যান্য ভাষায় এই জাতীয় কোড লিখতে অভ্যস্ত ছিল।
সিউর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.