পাইথন তালিকার আইটেমটিতে অন্য স্ট্রিংয়ের ভিতরে একটি স্ট্রিং রয়েছে কিনা তা পরীক্ষা করুন


586

আমার একটি তালিকা আছে:

my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']

এবং স্ট্রিং রয়েছে এমন আইটেমগুলি অনুসন্ধান করতে চান 'abc'। আমি এটা কিভাবে করবো?

if 'abc' in my_list:

যদি পরীক্ষা হবে 'abc'তালিকায় বিদ্যমান কিন্তু এটি একটি অংশ 'abc-123'এবং 'abc-456', 'abc'তার নিজের উপর কোন অস্তিত্ব নেই। সুতরাং আমি কীভাবে সমস্ত আইটেম ধারণ করতে পারি 'abc'?


19
বিপরীতটি পরীক্ষা করতে (যদি এক স্ট্রিংয়ের মধ্যে একাধিক স্ট্রিংয়ের মধ্যে একটি থাকে): stackoverflow.com/a/6531704/2436175
আন্তোনিও

এন্ট্রিগুলির বাম অংশগুলি যদি অনন্য থাকে তবে তালিকা থেকে ডিক তৈরির কথা বিবেচনা করুন: আংশিক স্ট্রিংয়ের উপর ভিত্তি করে একটি তালিকায় একটি প্রবেশিকা সন্ধান করুন
জর্জি

উত্তর:


930

আপনি যদি কেবল abcতালিকার কোনও স্ট্রিংয়ের উপস্থিতি পরীক্ষা করতে চান তবে আপনি চেষ্টা করতে পারেন

some_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
if any("abc" in s for s in some_list):
    # whatever

আপনি যদি সত্যিই সমস্ত আইটেম ধারণ করে পেতে চান তবে abcব্যবহার করুন

matching = [s for s in some_list if "abc" in s]

একটি আইটেম 6 টি উপাদানের অ্যারেতে রয়েছে কিনা তা আমাকে পরীক্ষা করতে হবে। 6 "যদি" করা দ্রুত হয় বা এটি একই হয়?
অলিভিয়ার পন্স 0

41
@ অলিভিয়ারপোনস, শুধু করুনif myitem in myarray:
-13

8
সাবস্ক্রিং 'এবিসি' যুক্ত সমস্ত স্ট্রিং পাওয়ার আরেকটি উপায়:filter(lambda element: 'abc' in element, some_list)
ড্রিফ্যাচ্যাচার

2
@ p014k: ব্যবহার index()পদ্ধতি:try: return mylist.index(myitem); except ValueError: pass
সেভেন Marnach

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

104

এটি কেবল এখানে ফেলে দিচ্ছেন: যদি আপনার একাধিক স্ট্রিংয়ের সাথে মিলের প্রয়োজন হয়, উদাহরণস্বরূপ abcএবংdef , আপনি নীচে দুটি বোঝার সংমিশ্রণ করতে পারেন:

matchers = ['abc','def']
matching = [s for s in my_list if any(xs in s for xs in matchers)]

আউটপুট:

['abc-123', 'def-456', 'abc-456']

4
আমি ঠিক এই জন্যই গুগল করছিলাম .. ধন্যবাদ!
N8TRO

2
আপনি ব্যবহার করতে পারেন {s for s in my_list for xs in matchers if xs in s}(একটি অনন্য সেট তৈরি করতে কোঁকড়া বন্ধনী নোট করুন)। পড়তে আরও সহজ হতে পারে তবে বেশিরভাগ sমানগুলির কোনও মিল থাকলে তা ধীর হতে পারে , কারণ আপনার anyপ্রথম ম্যাচে দক্ষতার সাথে থামতে হবে।
ম্যাথিয়াস ফ্রিপ

82

filterযে উপাদান রয়েছে তা পেতে ব্যবহার করুন abc

>>> lst = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
>>> print filter(lambda x: 'abc' in x, lst)
['abc-123', 'abc-456']

আপনি একটি তালিকা বোধগম্যতা ব্যবহার করতে পারেন।

>>> [x for x in lst if 'abc' in x]

যাইহোক, শব্দটি listভেরিয়েবল নাম হিসাবে ব্যবহার করবেন না কারণ এটি ইতিমধ্যে listটাইপের জন্য ব্যবহৃত হয়েছে ।


50

যদি আপনার কেবল আবশ্যকটি জানতে প্রয়োজন যে 'এবিসি' আইটেমগুলির মধ্যে একটিতে রয়েছে কিনা, এটি হ'ল সংক্ষিপ্ততম উপায়:

if 'abc' in str(my_list):

1
এটি যদি আপনার "[abc1", "1abc2"] এর একটি তালিকা থাকে তবে এটি ব্যর্থ হবে কারণ এতে একটি মিল খুঁজে পাবে কারণ 'এবিসি' স্ট্রিংটি নতুন নির্মিত স্ট্রিংটিতে থাকবে
cgseller

2
হ্যাঁ, এটি হ'ল উদ্দেশ্যমূলক আচরণ ... আইটেমগুলির মধ্যে কোনও
একটিতে যদি

7
আমি জানি না কেন এই অন্য সমস্ত লোকেরা যখন প্রয়োজন হয় না তখন কেন এই সংশ্লেষিত ল্যাম্বদা সমাধানগুলি করার সিদ্ধান্ত নেয়! চমৎকার কাজ @ রোজারস
ntk4

1
আসলে একই প্রশ্নটি প্রায় নিজেই উত্তর দেয় ... আমি এটিতে কেবল 3 টি চিঠি যুক্ত করেছি।
রজারস

1
এটি একটি দুর্দান্ত সমাধান, তবে আপনি যদি প্রদত্ত স্ট্রিং সহ আইটেমগুলি সন্ধান করতে চান তবে আপনি সফল হতে পারবেন না। এখানে আপনি খুঁজে পেতে পারেন যে কোনও আইটেমের স্ট্রিং রয়েছে কিনা।
cslotty

18

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

অ-পুনরাবৃত্তিযোগ্য আইটেমগুলি এড়িয়ে এটিকে তালিকায় এই জাতীয় আইটেমগুলির সাথে গ্রেফতারতার সাথে ডিল করতে, নিম্নলিখিতটি ব্যবহার করুন:

[el for el in lst if isinstance(el, collections.Iterable) and (st in el)]

তারপরে, এই জাতীয় একটি তালিকা সহ:

lst = [None, 'abc-123', 'def-456', 'ghi-789', 'abc-456', 123]
st = 'abc'

আপনি এখনও ম্যাচিং আইটেম পাবেন ( ['abc-123', 'abc-456'])

পুনরাবৃত্তির জন্য পরীক্ষা সেরা নাও হতে পারে। এটি এখান থেকে পেয়েছেন: পাইথনে, কোনও বস্তু পুনরাবৃত্তিযোগ্য কিনা তা আমি কীভাবে নির্ধারণ করব?


[el for el in lst if el and (st in el)]প্রদত্ত উদাহরণটিতে আরও অর্থবোধ করবেন না ?
গর্ডো

@ টিনিক্স আমি কী তা না করেই পুনরাবৃত্তিযোগ্য বস্তুগুলি নিখুঁতভাবে পরিচালনা করবে, তাই না?
রবার্ট মুয়েল

"প্রদত্ত উদাহরণ" my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456'] এটিকে বেশি জটিল করার দরকার নেই।
গর্ডো

1
হ্যাঁ একেবারে - গৃহীত উত্তরটি পুরোপুরি উপযুক্ত এবং আমার পরামর্শটি আরও জটিল, তাই এটিকে অবহেলা করতে নির্দ্বিধায় - আমি যেমনটি দিয়েছিলাম ঠিক তেমন কারওর যেমন সমস্যা ছিল তেমন ক্ষেত্রে: যেমন তালিকাগুলিতে অ-পুনরাবৃত্তিযোগ্য আইটেমগুলি সত্যিকারের বিশ্বের সম্ভাবনা প্রদত্ত উদাহরণটিতে বিদ্যমান না থাকা সত্ত্বেও।
রবার্ট মুয়েল


10
for item in my_list:
    if item.find("abc") != -1:
        print item

3
আপনি যদি এই পদ্ধতি অবলম্বন করতে চলেছেন তবে আমি মনে করি এটি if 'abc' in itemব্যবহার না করে আরও বুদ্ধিমান item.find('abc') == -1
ওয়াট বাল্ডউইন


4

__contains__()পাইথন স্ট্রিং ক্লাসের পদ্ধতিটি ব্যবহার করুন :

a = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for i in a:
    if i.__contains__("abc") :
        print(i, " is containing")

3

আমি পাইথনে নতুন। আমি নীচের কোডটি কাজ করে পেয়েছি এবং এটি সহজেই বুঝতে পেরেছি:

my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for str in my_list:
    if 'abc' in str:
       print(str)


0
mylist=['abc','def','ghi','abc']

pattern=re.compile(r'abc') 

pattern.findall(mylist)

পাইথন .6. In এ এটি একটি ত্রুটি দেয়: প্রকারের ত্রুটি: প্রত্যাশিত স্ট্রিং বা বাইটস-এর মতো বস্তু
অ্যামফোর্স ক্লারিটি

1
নিবন্ধন করুন পাইথন ৩..6 এ পুনঃফিন্ডাল একটি স্ট্রিং আশা করে। বিকল্পটি হবে তালিকাটিকে স্ট্রিংয়ে রূপান্তরিত করে import re mylist=['abc','def','ghi','abcff'] my_list_string=''.join(mylist) string_to_find="abc" res=re.findall(string_to_find,my_list_string) print(res)
অরুন_মুনাগলা

1
দুর্বল বিন্যাসের জন্য দুঃখিত। কোনও কারণে যথাযথ লাইন ব্রেক করা যায়নি।
অরুন_মুনাগালা

0

আমি একটি অনুসন্ধান করেছি, যার জন্য আপনাকে একটি নির্দিষ্ট মান ইনপুট করতে হবে, তারপরে এটি তালিকা থেকে কোনও মান সন্ধান করবে যা আপনার ইনপুটটি ধারণ করে:

my_list = ['abc-123',
        'def-456',
        'ghi-789',
        'abc-456'
        ]

imp = raw_input('Search item: ')

for items in my_list:
    val = items
    if any(imp in val for items in my_list):
        print(items)

'Abc' অনুসন্ধান করার চেষ্টা করুন।



0

আমার তালিকার সূচীগুলি দরকার যা ম্যাচের সাথে মিলে যায়:

lst=['abc-123', 'def-456', 'ghi-789', 'abc-456']

[n for n, x in enumerate(lst) if 'abc' in x]

আউটপুট

[0, 3]

-1

প্রশ্ন: এবিসির তথ্য দাও

    a = ['abc-123', 'def-456', 'ghi-789', 'abc-456']


    aa = [ string for string in a if  "abc" in string]
    print(aa)

Output =>  ['abc-123', 'abc-456']

-2

আমার জ্ঞান থেকে, একটি 'ফর' বিবৃতি সর্বদা সময় গ্রাস করবে।

তালিকার দৈর্ঘ্য যখন বেড়ে চলেছে তখন কার্যকর করার সময়টিও বাড়বে।

আমি মনে করি, 'is' স্টেটমেন্টের সাথে স্ট্রিংয়ের একটি স্ট্রিং অনুসন্ধান করা কিছুটা দ্রুত is

In [1]: t = ["abc_%s" % number for number in range(10000)]

In [2]: %timeit any("9999" in string for string in t)
1000 loops, best of 3: 420 µs per loop

In [3]: %timeit "9999" in ",".join(t)
10000 loops, best of 3: 103 µs per loop

তবে, আমি একমত যে anyবিবৃতিটি আরও পঠনযোগ্য।

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