একাধিক স্ট্রিং অন্য স্ট্রিংয়ে বিদ্যমান কিনা তা পরীক্ষা করুন


378

অ্যারেতে থাকা কোনও স্ট্রিং অন্য স্ট্রিংয়ে উপস্থিত রয়েছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?

ভালো লেগেছে:

a = ['a', 'b', 'c']
str = "a123"
if a in str:
  print "some of the strings found in str"
else:
  print "no strings found in str"

এই কোডটি কাজ করে না, আমি কী অর্জন করতে চাই তা কেবল এটি প্রদর্শন করা।


5
আমি অবাক হয়েছি পারফের পদে একটি সংকলিত রেজেক্সের সাথে তুলনা করার জন্য এখনও কোনও উত্তর নেই (বিশেষত), বিশেষত স্ট্রিংয়ের আকার এবং অনুসন্ধানের জন্য "সূঁচ" এর সংখ্যার তুলনায়।
প্যাট

3
@ প্যাট আমি অবাক হই না। প্রশ্নটি পারফরম্যান্স নিয়ে নয়। আজ বেশিরভাগ প্রোগ্রামাররা এটি সম্পন্ন করার এবং পাঠযোগ্যতার জন্য বেশি যত্নশীল। পারফরম্যান্সের প্রশ্নটি বৈধ, তবে একটি আলাদা প্রশ্ন।
গেটলি

13
চলক হিসাবে স্ট্র ব্যবহার করা বিভ্রান্তিকর এবং এর ফলে অপ্রত্যাশিত আচরণ হতে পারে কারণ এটি একটি সংরক্ষিত শব্দ; দেখতে লিংক
চালাক গাই

রেজেক্সও [abc]পুরোপুরি ভালভাবে কাজ করে এবং পরীক্ষার জন্য আরও কয়েকজন পরীক্ষার্থী থাকলে দ্রুত হবে। তবে যদি স্ট্রিংগুলি নির্বিচারে হয় এবং আপনি একটি রেজেক্স নির্মাণের জন্য তাদের আগেভাগে জানেন না, আপনাকে এই any(x in str for x in a)পদ্ধতির ব্যবহার করতে হবে।
স্মি

@ ক্লেভারগুই আপনি ঠিক বলেছেন, যদিও এটি কোনও সংরক্ষিত শব্দ নয়, অন্যথায় আপনি এটি নির্ধারণ করতে সক্ষম হবেন না। এটি একটি অন্তর্নির্মিত।
wjandrea

উত্তর:


717

আপনি ব্যবহার করতে পারেন any:

a_string = "A string is more than its parts!"
matches = ["more", "wholesome", "milk"]

if any(x in a_string for x in matches):

একইভাবে তালিকা থেকে সমস্ত স্ট্রিং পাওয়া গেছে কিনা তা পরীক্ষা করতে allপরিবর্তে ব্যবহার করুন any


11
যে কোনও () একটি পুনরাবৃত্তযোগ্য লাগে। আপনি পাইথনের কোন সংস্করণটি ব্যবহার করছেন তা আমি নিশ্চিত নই তবে ২. in-এ আপনাকে কোনও যুক্তিতে () যুক্তির চারপাশে [] লাগাতে হবে। যে কোনও ([x x এন্টার x এর জন্য একটি]) যাতে বোঝা একটি পুনরাবৃত্ত হয়। তবে পাইথনের পরবর্তী সংস্করণগুলি ইতিমধ্যে এটি করেছে।
emispowder

7
@ মার্ক বাইয়ার্স: দেরিতে মন্তব্যের জন্য দুঃখিত, তবে স্ট্রিংটি খুঁজে পাওয়া মুদ্রণের কোনও উপায় আছে কি? আপনি এই কিভাবে করবেন। ধন্যবাদ.
শঙ্কর কুমার

3
নিশ্চিত নয় যে আমি বুঝতে পেরেছি, যদি একটি তালিকা থাকে এবং স্ট্রামের সাথে ম্যাচের জিনিসটি হয় তবে এক্স কী? পাইথন নবাগত ftw। :)
লাল

2
@ রেড: আপনি for x in a"তালিকার প্রতিটি উপাদানগুলির জন্য" পড়তে পারেন। যেহেতু aস্ট্রিংগুলির একটি তালিকা, এবং xসেই তালিকার একটি উপাদান xএটি একটি স্ট্রিং (মূল উদাহরণে 'এ', 'বি', 'সি' এর মধ্যে একটি)
ব্যবহারকারী

6
@ এমসপাউডার পাইথন ২.6.৯-এ যেমন রয়েছে তেমনটি আমার পক্ষে ভাল কাজ করে।
MPlanchard

67

any()আপনি যা চান তা হ'ল Trueবা এখন পর্যন্ত সেরা পন্থা False, তবে আপনি নির্দিষ্টভাবে কোন স্ট্রিং / স্ট্রিংয়ের সাথে মেলে তা জানতে চাইলে আপনি কয়েকটি জিনিস ব্যবহার করতে পারেন।

আপনি যদি প্রথম ম্যাচটি চান ( Falseডিফল্ট হিসাবে):

match = next((x for x in a if x in str), False)

আপনি যদি সমস্ত মিল (ডুপ্লিকেট সহ) পেতে চান:

matches = [x for x in a if x in str]

আপনি যদি সমস্ত অনুলিপি ম্যাচ পেতে চান (অর্ডার উপেক্ষা করে):

matches = {x for x in a if x in str}

আপনি যদি সমস্ত অ-সদৃশ ম্যাচগুলি সঠিক ক্রমে পেতে চান:

matches = []
for x in a:
    if x in str and x not in matches:
        matches.append(x)

শেষ ম্যাচের জন্য দয়া করে উদাহরণ যোগ করুন
ওলেগ কোকরিন

@ ওলেগকোকরিন: এটি একই সারণীতে এটি মিলে যাওয়া স্ট্রিংগুলির একটি তালিকা তৈরি করে তবে এটি দুটি প্রথম হলে কেবল প্রথমটিকে রাখে।
zondo

একটি OrderedDictসম্ভবত সম্ভবত তালিকার চেয়ে বেশি পারফরম্যান্ট। দেখুন এ "তালিকায় সদৃশ মুছে ফেলার পদ্ধতি" এই উত্তর
wjandrea

44

আপনার স্ট্রিংগুলি স্ট্রিংগুলি দীর্ঘায়িত হয়ে aবা strদীর্ঘায়িত হওয়া উচিত। সরল সমাধানগুলি O (S * (A ^ 2)) নেয়, যেখানে Sদৈর্ঘ্য strএবং A এর মধ্যে সমস্ত স্ট্রিংয়ের দৈর্ঘ্যের যোগফল a। আরও দ্রুত সমাধানের জন্য, স্ট্রিং মিলের জন্য আহো-করাসিক অ্যালগরিদমটি দেখুন , যা লিনিয়ার সময় হে (এস + এ) তে চলে।


আহো-করাসিক কি উপসর্গের পরিবর্তে সাবস্ট্রিংগুলি সন্ধান করতে পারে?
রেট্রো কোড

1
কিছু অজগর আহো-করাসিক গ্রন্থাগার এখানে এবং এখানে রয়েছে
ভোরপাল

23

এর সাথে কিছু বৈচিত্র যুক্ত করতে regex:

import re

if any(re.findall(r'a|b|c', str, re.IGNORECASE)):
    print 'possible matches thanks to regex'
else:
    print 'no matches'

অথবা যদি আপনার তালিকাটি দীর্ঘ হয় - any(re.findall(r'|'.join(a), str, re.IGNORECASE))


1
এটি প্রশ্নের প্রদত্ত ব্যবহারের ক্ষেত্রে কাজ করে। আপনি যদি অনুসন্ধান করেন (বা *এটি ব্যর্থ হয়, যেহেতু রেজেক্স সিনট্যাক্সের জন্য উদ্ধৃতি করা দরকার।
গেটলি

2
আপনি প্রয়োজনে এটি এড়াতে পারেন '|'.join(map(re.escape, strings_to_match))। আপনি সম্ভবত re.compile('|'.join(...))হিসাবে sould ।
আরটিয়ার

12

আপনার উপাদানগুলির উপর পুনরাবৃত্তি করতে হবে।

a = ['a', 'b', 'c']
str = "a123"
found_a_string = False
for item in a:    
    if item in str:
        found_a_string = True

if found_a_string:
    print "found a match"
else:
    print "no match found"

2
হ্যাঁ আমি কীভাবে এটি করতে জানতাম তবে মার্ক্সের উত্তরের তুলনায় এটি ভয়াবহ কোড।
jahmax

10
আপনি যদি মার্কের কোডটি বুঝতে পারেন তবেই। আপনার যে সমস্যাটি ছিল তা হ'ল আপনি আপনার অ্যারের উপাদানগুলি পরীক্ষা করছিলেন না। আপনি যা চান তা সম্পাদন করার জন্য প্রচুর সংক্ষিপ্ত, অজগর উপায় রয়েছে যা আপনার কোডের সাথে কী ভুল ছিল তার সারাংশ লুকিয়ে রাখবে।
সিউমাস ক্যাম্পবেল

9
এটি 'ভয়াবহ কোড' হতে পারে তবে এটি কোনও () কী করে । এছাড়াও, এটি আপনাকে মিলিয়ে আসল স্ট্রিং দেয় যেখানে কোনও () আপনাকে কেবল একটি ম্যাচ আছে বলে দেয়।
alldayremix

4

জবার্নাদাস ইতিমধ্যে জটিলতা হ্রাস করার জন্য আহো-করাসিক-অ্যালগোরিদমের উল্লেখ করেছিলেন ।

পাইথনে এটি ব্যবহারের একটি উপায় এখানে:

  1. এখান থেকে aho_corasick.py ডাউনলোড করুন

  2. আপনার মূল পাইথন ফাইলের মতো একই ডিরেক্টরিতে এটি রাখুন এবং নাম দিন aho_corasick.py

  3. নিম্নলিখিত কোড সহ অ্যালোরিথম চেষ্টা করুন:

    from aho_corasick import aho_corasick #(string, keywords)
    
    print(aho_corasick(string, ["keyword1", "keyword2"]))

লক্ষ্য করুন যে অনুসন্ধানটি কেস-সংবেদনশীল


3
a = ['a', 'b', 'c']
str =  "a123"

a_match = [True for match in a if match in str]

if True in a_match:
  print "some of the strings found in str"
else:
  print "no strings found in str"

1

এটা তোলে প্রসঙ্গ উপর নির্ভর করে আপনার মত একক আক্ষরিক চেক করতে চান যদি অনুমান করা (W, .. ইত্যাদি কোনো একক শব্দ একটি, ই,) মধ্যে যথেষ্ট

original_word ="hackerearcth"
for 'h' in original_word:
      print("YES")

আপনি যদি মূল_শব্দটির মধ্যে কোনও চরিত্র পরীক্ষা করতে চান: ব্যবহার করুন

if any(your_required in yourinput for your_required in original_word ):

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

original_word = ['h', 'a', 'c', 'k', 'e', 'r', 'e', 'a', 'r', 't', 'h']
yourinput = str(input()).lower()
if all(requested_word in yourinput for requested_word in original_word):
    print("yes")

আপনার ইনপুট কি হবে? আমি দুটি জিনিস চিনতে পারি: বাক্যটি যেখানে আমি কিছু খুঁজছি। আমি খুঁজছি শব্দের অ্যারে। তবে আপনি তিনটি পরিবর্তনশীল বর্ণনা করুন এবং তৃতীয়টি কী তা আমি পেতে পারি না।
মায়িড

1

স্ট্রিংয়ে সমস্ত তালিকা উপাদানগুলি কীভাবে পাওয়া যায় সে সম্পর্কে আরও কিছু তথ্য

a = ['a', 'b', 'c']
str = "a123" 
list(filter(lambda x:  x in str, a))

1

একটি আশ্চর্যজনক দ্রুত পদ্ধতির ব্যবহার হল set:

a = ['a', 'b', 'c']
str = "a123"
if set(a) & set(str):
    print("some of the strings found in str")
else:
    print("no strings found in str")

যদি aকোনও একাধিক-অক্ষর মান না থাকে (তবে এটি উপরে বর্ণিতany হিসাবে ব্যবহার করা হয় ) তবে এটি কাজ করে। যদি তাই হয়, উল্লেখ করার সহজ এর একটি স্ট্রিং হিসাবে: ।aa = 'abc'


0
flog = open('test.txt', 'r')
flogLines = flog.readlines()
strlist = ['SUCCESS', 'Done','SUCCESSFUL']
res = False
for line in flogLines:
     for fstr in strlist:
         if line.find(fstr) != -1:
            print('found') 
            res = True


if res:
    print('res true')
else: 
    print('res false')

আউটপুট উদাহরণ চিত্র


0

আমি গতির জন্য এই জাতীয় ফাংশনটি ব্যবহার করব:

def check_string(string, substring_list):
    for substring in substring_list:
        if substring in string:
            return True
    return False

0
data = "firstName and favoriteFood"
mandatory_fields = ['firstName', 'lastName', 'age']


# for each
for field in mandatory_fields:
    if field not in data:
        print("Error, missing req field {0}".format(field));

# still fine, multiple if statements
if ('firstName' not in data or 
    'lastName' not in data or
    'age' not in data):
    print("Error, missing a req field");

# not very readable, list comprehension
missing_fields = [x for x in mandatory_fields if x not in data]
if (len(missing_fields)>0):
    print("Error, missing fields {0}".format(", ".join(missing_fields)));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.