python - (X x== a এবং y== খ) বা(x== বি এবং y== ক) প্রকাশ করার জন্য আরও কি মার্জিত উপায় আছে?




boolean-logic (7)

আমি পাইথনে ((x == a and y == b) or (x == b and y == a)) মূল্যায়নের চেষ্টা করছি, তবে এটি কিছুটা ভারবস বলে মনে হচ্ছে। আরও কি মার্জিত উপায় আছে?


আপনি আপনার ডেটা উপস্থাপন করতে টিপলস ব্যবহার করতে পারেন এবং তারপরে সেট অন্তর্ভুক্তির জন্য পরীক্ষা করতে পারেন:

def test_fun(x, y):
    test_set = {(a, b), (b, a)}

    return (x, y) in test_set

আমার মতে সর্বাধিক মার্জিত উপায় হবে

(x, y) in ((a, b), (b, a))

সেটগুলি ব্যবহার করার চেয়ে এটি একটি ভাল উপায়, যেমন answers {a, b} == {y, x} , অন্যান্য উত্তরে উল্লিখিত হিসাবে কারণ আমাদের ভেরিয়েবলগুলি হ্যাশযোগ্য কিনা তা ভাবার দরকার নেই।


উপাদানগুলি হ্যাশযোগ্য হলে আপনি সেটগুলি ব্যবহার করতে পারেন:

{a, b} == {y, x}

এগুলি যদি সংখ্যা হয় তবে আপনি (x+y)==(a+b) and (x*y)==(a*b)

যদি এগুলি তুলনামূলক আইটেম হয় তবে আপনি min(x,y)==min(a,b) and max(x,y)==max(a,b)

তবে ((x == a and y == b) or (x == b and y == a)) পরিষ্কার, নিরাপদ এবং আরও সাধারণ।


দেখে মনে হচ্ছে ওপি কেবলমাত্র দুটি ভেরিয়েবলের ক্ষেত্রেই উদ্বিগ্ন ছিল, তবে স্ট্যাকওভারফ্লো যেহেতু পরে একই প্রশ্নটি অনুসন্ধান করে তাদের জন্যও, আমি এখানে জেনেরিক কেসটি কিছুটা বিশদভাবে সমাধান করার চেষ্টা করব; পূর্ববর্তী একটি উত্তরে ইতিমধ্যে itertools.permutations() ব্যবহার করে একটি জেনেরিক উত্তর রয়েছে, তবে এই পদ্ধতিটি O(N*N!) তুলনা করে, কারণ সেখানে N! প্রতিটি N আইটেম সঙ্গে ক্রম। (এটি এই উত্তরের মূল প্রেরণা ছিল)

প্রথমে সংক্ষেপে বলা যাক পূর্ববর্তী উত্তরের কয়েকটি পদ্ধতি জেনেরিক ক্ষেত্রে কীভাবে প্রয়োগ করা হয়, এখানে উপস্থাপিত পদ্ধতির অনুপ্রেরণা হিসাবে। আমি (x, y) এবং B কে (a, b) উল্লেখ করার জন্য A ব্যবহার করব, যা নির্বিচারে (তবে সমান) দৈর্ঘ্যের দ্বিগুণ হতে পারে।

set(A) == set(B) দ্রুত, তবে কেবল তখনই কাজ করে যদি মানগুলি হ্যাশযোগ্য হয় এবং আপনি গ্যারান্টি দিতে পারেন যে কোনও একটিতে কোনও দ্বৈত মান নেই। (উদাহরণস্বরূপ D {1, 1, 2} == {1, 2, 2} , @ ড্যানিয়েল মেসেজোর জবাবের অধীনে @ ব্যবহারকারী 2357112 দ্বারা নির্দেশিত হিসাবে)

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

def counts(items):
    d = {}
    for item in items:
        d[item] = d.get(item, 0) + 1
    return d

counts(A) == counts(B)

sorted(A) == sorted(B) হ্যাশযোগ্য মানগুলির প্রয়োজন হয় না, তবে এটি কিছুটা ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে মানোন্নয়ন করতে হয়। (সুতরাং যেমন complex কাজ করবে না)

A in itertools.permutations(B) হ্যাশেবল বা অগ্নিপরীক্ষাযোগ্য মান প্রয়োজন হয় না, তবে ইতিমধ্যে উল্লিখিত মত এর O(N*N!) জটিলতা রয়েছে, তাই মাত্র 11 টি আইটেম থাকা সত্ত্বেও এটি শেষ করতে এক সেকেন্ড সময় নিতে পারে।

সুতরাং, সাধারণ হওয়ার মতো কোনও উপায় আছে তবে এটি কি খুব দ্রুত হয়? হ্যাঁ, "ম্যানুয়ালি" প্রতিটি আইটেমের সমান পরিমাণ রয়েছে তা যাচাই করে: (এইটির জটিলতা হ'ল O(N^2) , সুতরাং এটি বড় ইনপুটগুলির পক্ষেও ভাল নয়; আমার মেশিনে, 10 কে আইটেম নিতে পারে এক সেকেন্ডেরও বেশি - তবে 10 টি আইটেমের মতো ছোট ইনপুট সহ, এটি অন্যদের মতোই দ্রুত)

def unordered_eq(A, B):
    for a in A:
        if A.count(a) != B.count(a):
            return False
    return True

সেরা পারফরম্যান্স পেতে, কেউ প্রথমে dict ভিত্তিক পদ্ধতিটি চেষ্টা করে দেখতে পারে, অরঞ্জনীয় মূল্যবোধের কারণে যদি ব্যর্থ হয় তবে sorted ভিত্তিক পদ্ধতিতে ফিরে যেতে পারেন এবং অবশেষে যদি সেটিও ব্যর্থ হয় তবে count বেসড পদ্ধতিতে ফিরে যান অপরিবর্তনীয় মান


যদি আইটেমগুলি হ্যাশযোগ্য না হয় তবে তুলনা করার আদেশকে সমর্থন করে তবে আপনি চেষ্টা করতে পারেন:

sorted((x, y)) == sorted((a, b))

আপনি ইতিমধ্যে সর্বাধিক পঠনযোগ্য সমাধান পেয়েছেন । এটি প্রকাশের অন্যান্য উপায় রয়েছে, সম্ভবত কম অক্ষর রয়েছে তবে তারা পড়তে কম সোজা-এগিয়ে রয়েছে forward

মানগুলি আপনার সেরা বাজিকে কী উপস্থাপন করে তার উপর নির্ভর করে কোনও স্পিকিং নাম দিয়ে কোনও ফাংশনে চেকটি মোড়ানো । বিকল্প বা অতিরিক্ত হিসাবে, আপনি নিখুঁত উচ্চ শ্রেণীর বস্তুগুলিতে প্রতিটি x, y এবং a, b অবজেক্টগুলিকে মডেল করতে পারেন যা আপনি ক্লাসের সাম্যতা পরীক্ষা পদ্ধতিতে বা উত্সর্গীকৃত কাস্টম ফাংশনে তুলনার যুক্তির সাথে তুলনা করতে পারেন।





boolean-logic