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


113

আমি খুঁজে পেয়েছি, সম্পর্কিত একটি প্রশ্ন রয়েছে, যাতে তালিকায় অন্তত একটি আইটেম উপস্থিত থাকে কীভাবে তা খুঁজে বের করতে:
নীচের আইটেমগুলির একটি তালিকায় রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?

তবে সমস্ত আইটেম একটি তালিকায় বিদ্যমান কিনা তা খুঁজে পাওয়ার সর্বোত্তম ও অজগর উপায় কী?

দস্তাবেজগুলি অনুসন্ধান করে আমি এই সমাধানটি পেয়েছি:

>>> l = ['a', 'b', 'c']
>>> set(['a', 'b']) <= set(l)
True
>>> set(['a', 'x']) <= set(l)
False

অন্যান্য সমাধানটি হ'ল:

>>> l = ['a', 'b', 'c']
>>> all(x in l for x in ['a', 'b'])
True
>>> all(x in l for x in ['a', 'x'])
False

তবে এখানে আপনাকে আরও টাইপিং করতে হবে।

অন্য কোন সমাধান আছে কি?


5
এর সাথে কী হয়েছে set(smaller) <= set(larger)?
ইউরোমো

1
আমি মনে করি আপনার 'দ্বিতীয়' সহ দ্বিতীয় সমাধানগুলি আমার কাছে ঠিক সূক্ষ্ম এবং পাইথনিক দেখায়।
জিহো নোহ

উত্তর:


156

<=পাইথনের মতো অপারেটরগুলি সাধারণত "এর চেয়ে কম বা সমান" এর চেয়ে আলাদা কিছু বোঝার জন্য ওভাররাইড হয় না। এটি স্ট্যান্ডার্ড লাইব্রেরিটির পক্ষে অস্বাভাবিক - এটি আমার কাছে লেগ্যাসি এপিআইয়ের মতো গন্ধযুক্ত।

সমতুল্য এবং আরও স্পষ্ট-নামযুক্ত পদ্ধতিটি ব্যবহার করুন set.issubset,। দ্রষ্টব্য যে আপনার যুক্তিটিকে একটি সেটে রূপান্তর করতে হবে না; এটি আপনার প্রয়োজন হলে তা করবে।

set(['a', 'b']).issubset(['a', 'b', 'c'])

2
জানতেন না আপনি ইস্যুবসেটের যুক্তি হিসাবে সরাসরি তালিকাটি পাস করতে পারবেন ... দুর্দান্ত!
tsimbalar

1
আমি যখন অনুভূতির সাথে একমত হই তখনও একই জিনিসটির ধারণা <=এবং issubsetঅর্থটি নিয়ে আমি বেশ ঠিক । এটিকে কেন অপছন্দ করেন?
কर्क স্ট্রুজার

2
@ জাস্ট: প্রাথমিকভাবে, কারণ <=এটি কোনও দস্তাবেজে সন্ধান না করা বা সেট থিয়োরিয়ায় কী বোঝায় তার পূর্বে জ্ঞান না রেখে সেটটির অর্থ কী তা স্পষ্ট নয় , তবে প্রত্যেকে issubsetস্বয়ংক্রিয়ভাবে কী বোঝায় তা জানে ।
গ্লেন মেইনার্ড 21

2
আপনি (অ-যথাযথ) সাবসেটের জন্য গাণিতিক অপারেটর জানেন? এটি মূলত দেখতে অনেকটা বৃত্তাকার মতো দেখতে <=;)
dom0

এই সমাধান ভালবাসা। বুলের পরিবর্তে কোনও সূচকের অবস্থান বা তালিকার মান পাওয়ার কোনও উপায় আছে (সত্য: মিথ্যা)?
ভ্লাদ গুলিন

62

আমি সম্ভবত setনিম্নলিখিত পদ্ধতিতে ব্যবহার করব :

set(l).issuperset(set(['a','b'])) 

বা অন্যভাবে রাউন্ড:

set(['a','b']).issubset(set(l)) 

আমি এটি কিছুটা বেশি পঠনযোগ্য মনে করি তবে এটি অত্যধিক মেরে ফেলতে পারে। সংকলনের মধ্যে ইউনিয়ন / ছেদটি / পার্থক্য গণনা করার জন্য সেটগুলি বিশেষত দরকারী তবে এই পরিস্থিতিতে এটি সর্বোত্তম বিকল্প নাও হতে পারে ...


আসলে, MySet.issubset(MyOtherSet)এবং MySet <= MyOtherSetএকই।
Wok

1
@ গীত: ওহ, আমি এটি জানতাম না, তবে আমি মনে করি <= বাক্য বিন্যাসটি কিছুটা বিভ্রান্তিকর কারণ অনুরূপ সিনট্যাক্স তালিকাগুলির সাথে ব্যবহার করা যেতে পারে তবে খুব আলাদা অর্থ সহ।
tsimbalar

3
এটি অন্তর্ভুক্তির স্মরণে রাখলে এটি বিভ্রান্তিকর নয় যে কোনও সেটগুলির কোনও আংশিক ক্রম সংজ্ঞায়িত করে। এটি প্রকৃতপক্ষে কিছুটা বিভ্রান্তির <=অর্থ যার ক্রমগুলির জন্য এটির অর্থ রয়েছে: শব্দার্থবিজ্ঞানের ক্রম পরিবর্তনের পরিবর্তে এর অর্থ 'প্রতীক' বলে আশা করা যেতে পারে।
অ্যারোনস্টার্লিং

1
@ অ্যারোনাস্টারলিং: মিমি, আমি কোডটি :-) টাইপ করার সময় আমি ব্যক্তিগতভাবে "আংশিক ক্রম" সম্পর্কে খুব বেশি ভাবি না, তবে আমি এই বিষয়টির <=সাথে একমত যে সিকোয়েন্সগুলি ব্যবহার করাও একরকমভাবে অদ্ভুত বোধ করে ...
tsimbalar

3
আমি একটু gotcha হয় গাড়ীতে আঘাত এখানে আমি উল্লেখ করতে চাই: যদি আপনি এই পদ্ধতি ব্যবহার করেন, তাহলে হয় সেট করার জন্য আপনার তালিকা রূপান্তর, যা কোন সদৃশ মানে। set(['a','a']).issubset(['a'])আয় True
অরেঞ্জস্টার

11

আমি এই দুটি পছন্দ করি কারণ এগুলি সবচেয়ে যুক্তিযুক্ত বলে মনে হয়, দ্বিতীয়টি সংক্ষিপ্ত এবং সম্ভবত দ্রুততম হয় (এখানে setআক্ষরিক বাক্য গঠন যা পাইথন ২. 2. এ ব্যাকপোর্ট করা হয়েছে তা ব্যবহার করে এখানে দেখানো হয়েছে ):

all(x in {'a', 'b', 'c'} for x in ['a', 'b'])
#   or
{'a', 'b'}.issubset({'a', 'b', 'c'})

আপনি যখন সময়সীমা () দিয়ে এটি পরিমাপ করেন তখন "সমস্ত" সমাধানটি দ্রুত হয়। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
এটারসন

3

আপনার তালিকাগুলিতে যদি এর মতো নকল থাকে তবে কী হবে:

v1 = ['s', 'h', 'e', 'e', 'p']
v2 = ['s', 's', 'h']

সেটগুলিতে সদৃশ থাকে না। সুতরাং, নিম্নলিখিত লাইনটি সত্য ফিরে আসে।

set(v2).issubset(v1)

সদৃশগুলির জন্য গণনা করতে, আপনি কোডটি ব্যবহার করতে পারেন:

v1 = sorted(v1)
v2 = sorted(v2)


def is_subseq(v2, v1):
    """Check whether v2 is a subsequence of v1."""
    it = iter(v1)
    return all(c in it for c in v2) 

সুতরাং, নিম্নলিখিত লাইনটি মিথ্যা প্রদান করে।

is_subseq(v2, v1)

1

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

>>> case  = "caseCamel"
>>> label = "Case Camel"
>>> list  = ["apple", "banana"]
>>>
>>> (case or label) in list
False
>>> list = ["apple", "caseCamel"]
>>> (case or label) in list
True
>>> (case and label) in list
False
>>> list = ["case", "caseCamel", "Case Camel"]
>>> (case and label) in list
True
>>>

এবং আপনার যদি ভেরিয়েবলগুলির একটি দীর্ঘ তালিকা থাকে তবে sublist variable

>>>
>>> list  = ["case", "caseCamel", "Case Camel"]
>>> label = "Case Camel"
>>> case  = "caseCamel"
>>>
>>> sublist = ["unique banana", "very unique banana"]
>>>
>>> # example for if any (at least one) item contained in superset (or statement)
...
>>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
False
>>>
>>> sublist[0] = label
>>>
>>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
True
>>>
>>> # example for whether a subset (all items) contained in superset (and statement)
...
>>> # a bit of demorgan's law
...
>>> next((False for item in sublist if item not in list), True)
False
>>>
>>> sublist[1] = case
>>>
>>> next((False for item in sublist if item not in list), True)
True
>>>
>>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
True
>>>
>>>

0

ল্যাম্বডা এক্সপ্রেশনটি ব্যবহার করে এটি কীভাবে করা যায় তার একটি উদাহরণ হ'ল:

issublist = lambda x, y: 0 in [_ in x for _ in y]

1
আপনার উত্তরটি ব্যাখ্যা / বিস্তারিত জানাতে মন্তব্যগুলি যুক্ত করুন
শারদ

0

ওপির ক্ষেত্রে নয়, তবে - যে কেউ ডিক্টসে ছেদ করতে চায় এবং দুর্বল গুগলিংয়ের কারণে এখানেই শেষ হয়েছে - যেমন আপনার সাথে কাজ করা দরকার dict.items:

>>> a = {'key': 'value'}
>>> b = {'key': 'value', 'extra_key': 'extra_value'}
>>> all(item in a.items() for item in b.items())
True
>>> all(item in b.items() for item in a.items())
False

এর কারণ dict.itemsকী / মান জোড়ার টিপলগুলি দেয় এবং পাইথনের যে কোনও বস্তুর মতো, তারা পরস্পরের সাথে তুলনীয় হয়

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