পাইথনে স্ট্রিংয়ের সাবস্ট্রিং কীভাবে পাব?


2142

তৃতীয় অক্ষর থেকে স্ট্রিংয়ের শেষের দিকে একটি নতুন স্ট্রিং পেতে পাইথনে স্ট্রিংটি সাবস্ট্রিং করার কোনও উপায় আছে কি?

ভালো লাগবে myString[2:end]?

যদি দ্বিতীয় অংশটি ছেড়ে যাওয়ার অর্থ 'শেষ অবধি', এবং যদি আপনি প্রথম অংশটি ছেড়ে দেন, এটি কি শুরু থেকেই শুরু হয়?


1
এটিতে একটি স্পষ্ট ব্যাখ্যা রয়েছে পাইথোনসেন্ট্রাল.আইও
মারিও

উত্তর:


3178
>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'

পাইথন এই ধারণাটিকে "স্লাইসিং" বলে এবং এটি কেবল স্ট্রিংয়ের চেয়েও বেশি কাজ করে। একটি বিস্তৃত ভূমিকা জন্য এখানে একবার দেখুন ।


401

সম্পূর্ণতার জন্য যেমন অন্য কেউ তা উল্লেখ করেনি। একটি অ্যারের স্লাইসে তৃতীয় প্যারামিটারটি একটি পদক্ষেপ। সুতরাং একটি স্ট্রিং বিপরীত হিসাবে সহজ:

some_string[::-1]

অথবা বিকল্প অক্ষর নির্বাচন করা হবে:

"H-e-l-l-o- -W-o-r-l-d"[::2] # outputs "Hello World"

স্ট্রিংয়ের মাধ্যমে এগিয়ে এবং পিছনের দিকে পা রাখার ক্ষমতা শুরু বা শেষ থেকে স্লাইস অ্যারে সক্ষম হওয়ার সাথে ধারাবাহিকতা বজায় রাখে।


21
@ এমটিএহএমড প্রশ্নের সাথে একদম সম্পর্কিত। আপনি যদি স্ট্রিং থেকে বিকল্প অক্ষর নির্বাচন করে সাবস্ট্রিং করতে চান? এটাই হবে আমার_সারা [:: 2]
এন্ডোফেজ

আমি মনে করি এটি সম্ভবত আপনি স্লাইসের তৃতীয় প্যারামিটারটি উল্লেখ করতে চেয়েছিলেন mention স্ট্রিং থেকে অন্য সমস্ত চরিত্রটি পাওয়া দরকার কোথাও একটি গুরুত্বপূর্ণ ব্যবহারের ক্ষেত্রে হতে পারে তবে আমার কখনও এটি করতে হয়নি। আপনি যা জানেন তা প্রদর্শন করার ইচ্ছা নিয়ে কোনও ভুল নেই - আপনি যদি এটি করতে না পারেন তবে জিনিসগুলি জানার কী দরকার। :) তবে প্রশ্নের সাথে প্রাসঙ্গিকতার বিষয়টি অত্যুক্তিযুক্ত।
জন লকউড

1
অবশ্যই, বিকল্প চরিত্রগুলি নির্বাচনের নির্দিষ্ট উদাহরণটি প্রশ্নের সাথে প্রাসঙ্গিক নাও হতে পারে তবে খুব বেশি টুকরো টুকরো করার একটি তৃতীয় প্যারামিটার বোঝা প্রাসঙ্গিক এবং সাধারণ উদাহরণগুলি এটি কীভাবে কাজ করে তা চিত্রিত করে। পাইথন সম্প্রদায়ের নতুন সদস্যদের বন্ধুত্বপূর্ণ উপায়ে শিক্ষিত করার দুর্দান্ত ইতিহাস রয়েছে :-)
এন্ডোফেজ

127

সাবস্ট্রাস্ট () সাধারণত (যেমন পিএইচপি এবং পার্ল) এইভাবে কাজ করে:

s = Substr(s, beginning, LENGTH)

সুতরাং পরামিতি হয় beginningএবং LENGTH

তবে পাইথনের আচরণ আলাদা; এটি সূচনা এবং শেষ (!) এর পরে একের প্রত্যাশা করে। নতুনদের দ্বারা এটি সনাক্ত করা কঠিন। সুতরাং সাবস্ট্রের (গুলি, শুরু, LENGTH) এর সঠিক প্রতিস্থাপন

s = s[ beginning : beginning + LENGTH]

75
অজগর দিকে যাওয়ার সময় নতুনদের অজগর
পদ্ধতিটি

3
এবং কেবল সম্পূর্ণতার জন্য, জাভা পাইথনের মতো যা স্ট্রিং.সুবস্ট্রিং () পদ্ধতিটি শুরু করে এবং একটি অতীত-শেষ হয়। এই এক মাত্র আমাকে কঠিন, আমি ধরে নিয়েছিলাম যে এটি বিশ্বের প্রতিটি অন্যান্য স্ট্রিং ফাংশনের মতো দৈর্ঘ্য।
ফিলহিবস

4
একজন (সম্ভবত) যে কাজ করতে আরো pythonic উপায়s[beginning:][:length]
victortv

2
যে কেউ পিএইচপির পরিবর্তে পাইথন দিয়ে শুরু করেছিলেন - পিএইচপি-র মতো ভাষাগুলি, আমি মনে করি পাইথন তার স্ট্রিং [শুরু: শেষ] এর সাথে অনেক বেশি সহজ এবং স্বজ্ঞাত। দৈর্ঘ্য সাধারণত প্রাসঙ্গিক নয়।
গ্লোয়ে

59

এটি অর্জনের একটি সাধারণ উপায় স্ট্রিং স্লাইসিং।

MyString[a:b] আপনাকে সূচী থেকে একটিতে বি স্ট্রিং দেয় (খ - 1)।


23

একটি উদাহরণ এখানে অনুপস্থিত বলে মনে হচ্ছে: সম্পূর্ণ (অগভীর) অনুলিপি।

>>> x = "Hello World!"
>>> x
'Hello World!'
>>> x[:]
'Hello World!'
>>> x==x[:]
True
>>>

এটি সিক্যুয়েন্স ধরণের (ইন্টার্নযুক্ত স্ট্রিংগুলির নয়) অনুলিপি তৈরি করার জন্য একটি সাধারণ প্রতিমা [:]। অগভীর একটি তালিকা অনুলিপি করে, পাইথন তালিকার স্লাইস সিনট্যাক্সটি কোনও স্পষ্ট কারণে ব্যবহার করা হয়নি


12
সাবস্ট্রিং সম্পর্কিত প্রশ্নের সাথে এর কোনও যোগসূত্র নেই। এমনকি স্ট্রিংয়ের জন্য প্রযোজ্য নয়। স্ট্রিংএ = স্ট্রিংবি বলা যথেষ্ট ...
নিকু সুরডু

2
[:] সম্পূর্ণ অনুলিপি একটি নতুন কপি তৈরি করে, স্লাইস সিনট্যাক্স ব্যবহার করে এবং "প্রথম থেকে শেষ
অবধি

2
স্ট্রিং অপরিবর্তনীয় যেহেতু মূল বিষয় কী? a=bপর্যাপ্ত হওয়া উচিত।
bfontaine

1
@ গিমেল: আসলে, [:]অপরিবর্তনীয় ধরণের উপর কোনও অনুলিপি তৈরি হয় না। যদিও mysequence[:]বেশিরভাগ নিরীহ যখন mysequenceমতো অপরিবর্তনীয় ধরনের str, tuple, bytes(Py3) অথবা unicode(Py2), a = b[:]সমতুল্য হয় a = b, এটা ঠিক ডিসপ্যাচিং slicing বাইট কোড একটু সময় নষ্ট যা অগভীর কপি যখন তা এর অর্থহীন যেহেতু নিজেই ফিরে বস্তুর সাড়া , অবজেক্ট আইডেন্টিটি টেস্টগুলি বাদ দিয়ে, এটি কেবল নিজের অপরিবর্তনীয় স্ব সম্পর্কে অন্য একটি রেফারেন্স ফিরিয়ে দেওয়ার সমতুল্য।
শ্যাডোর্যাঞ্জার

3
এই উত্তরটি অন্যান্য সমালোচনা যোগফল চেষ্টা করা হচ্ছে: ইন পাইথন, স্ট্রিং অপরিবর্তনীয় হয়, তাই সেখানে একটি স্ট্রিং এর একটি অনুলিপি তৈরি করার কোনও কারণ নেই - তাই s[:]সব সময়ে একটি অনুলিপি তৈরি করে না: s = 'abc'; s0 = s[:]; assert s is s0। হ্যাঁ, পাইথনগুলিতে তালিকাগুলি পাওয়া না হওয়া পর্যন্ত list.copyএটি কোনও লিপি অনুলিপি করার মূর্তিযুক্ত উপায় ছিল , তবে অপরিবর্তনীয় ধরণের একটি সম্পূর্ণ টুকরো অনুলিপি করার কোনও কারণ নেই কারণ এটি পরিবর্তন করা যায় না, সুতরাং স্মৃতিতে কেবলমাত্র একটি থাকতে পারে এবং এটি অনুলিপি করা আমাদের সময় নষ্ট করা উচিত নয়। যেহেতু এই উত্তরটি ভুল এবং এমনকি প্রশ্নের উত্তর দেয় না - এটি কী মুছে ফেলা উচিত?
অ্যারন হল

18

পাইথনে স্ট্রিংটি স্ট্রিং করার কোনও উপায় আছে, তৃতীয় অক্ষর থেকে স্ট্রিংয়ের শেষ পর্যন্ত একটি নতুন স্ট্রিং পেতে?

ভালো লাগবে myString[2:end]?

হ্যাঁ, আপনি যদি ক্রমাগত সিঙ্গলটনে নাম নির্ধারণ করেন বা বাঁধেন , তবে এটি আসলে কাজ করে :endNone

>>> end = None
>>> myString = '1234567890'
>>> myString[2:end]
'34567890'

স্লাইস স্বরলিপিটিতে 3 টি গুরুত্বপূর্ণ যুক্তি রয়েছে:

  • শুরু
  • স্টপ
  • ধাপ

প্রদত্ত না হলে তাদের ডিফল্টগুলি হয় None- তবে আমরা সেগুলি স্পষ্টভাবে পাস করতে পারি:

>>> stop = step = None
>>> start = 2
>>> myString[start:stop:step]
'34567890'

যদি দ্বিতীয় অংশটি ছেড়ে যাওয়ার অর্থ 'শেষ অবধি', আপনি যদি প্রথম অংশটি ছেড়ে দেন, এটি কি শুরু থেকেই শুরু হয়?

হ্যাঁ, উদাহরণস্বরূপ:

>>> start = None
>>> stop = 2
>>> myString[start:stop:step]
'12'

নোট করুন যে আমরা স্লাইসে শুরুটি অন্তর্ভুক্ত করেছি, তবে আমরা কেবল থামি থামি না এবং সেখানে পৌঁছেছি।

যখন পদক্ষেপ হয় None, ডিফল্টরূপে স্লাইস 1ধাপের জন্য ব্যবহার করে। আপনি যদি নেতিবাচক পূর্ণসংখ্যার সাথে পদক্ষেপ নেন, পাইথন শেষ থেকে শুরু পর্যন্ত যেতে যথেষ্ট স্মার্ট।

>>> myString[::-1]
'0987654321'

আমি স্লাইস নোটেশন প্রশ্নের উত্তর সম্পর্কে আমার উত্তরে স্লাইস নোটেশনটি বিশদভাবে ব্যাখ্যা করি।


8

"শেষ" ব্যতীত আপনি ঠিক এটি পেয়ে গেছেন। একে স্লাইস নোটেশন বলা হয়। আপনার উদাহরণটি পড়তে হবে:

new_sub_string = myString[2:]

যদি আপনি দ্বিতীয় প্যারামিটারটি ছেড়ে দেন তবে এটি স্পষ্টভাবে স্ট্রিংয়ের শেষ।


6

আমি আলোচনায় দুটি পয়েন্ট যুক্ত করতে চাই:

  1. আপনি None"শুরুর" বা "শেষে" নির্দিষ্ট করতে খালি জায়গায় ব্যবহার করতে পারেন :

    'abcde'[2:None] == 'abcde'[2:] == 'cde'

    এটি ফাংশনে বিশেষত সহায়ক, যেখানে আপনি যুক্তি হিসাবে খালি স্থান সরবরাহ করতে পারবেন না:

    def substring(s, start, end):
        """Remove `start` characters from the beginning and `end` 
        characters from the end of string `s`.
    
        Examples
        --------
        >>> substring('abcde', 0, 3)
        'abc'
        >>> substring('abcde', 1, None)
        'bcde'
        """
        return s[start:end]
  2. পাইথনের টুকরো টুকরো জিনিস রয়েছে:

    idx = slice(2, None)
    'abcde'[idx] == 'abcde'[2:] == 'cde'

6

MyString 6 অফসেট শুরু এবং দৈর্ঘ্য 9 হয়েছে একটি অ্যাকাউন্ট সংখ্যা উপস্থিত রয়েছে, তাহলে আপনি অ্যাকাউন্ট নম্বর এই ভাবে নিষ্কাশন করতে পারেন: acct = myString[6:][:9]

যদি ওপি এটি গ্রহণ করে তবে তারা পরীক্ষামূলক পদ্ধতিতে চেষ্টা করতে চাইতে পারে,

myString[2:][:999999]

এটি কাজ করে - কোনও ত্রুটি উত্থাপিত হয় না এবং কোনও ডিফল্ট 'স্ট্রিং প্যাডিং' ঘটে না।


1
আমি মনে করি আপনি যদি myString[offset:][:length]myString[offset:][:]
ওপির

1
@ ভিক্টরওয়াল উত্তরটি তাদের (আমার মতো) যারা পাইথনকে ২ য় (তৃতীয়, চতুর্থ, ...) প্রোগ্রামিং ভাষা হিসাবে শিখেছেন এবং কিছু পরিচিত 'সিনট্যাক্স হুকস' ভাষাটির কাছে যেতে চান for ভাষার কোনও বিশেষজ্ঞ সম্ভবত আমার উত্তরটিকে কিছুটা নির্বোধ হিসাবে দেখবেন।
কপিপস্টেটি

এই জাতীয় উত্তরগুলি মুছে ফেলার জন্য পতাকাঙ্কিত করা উচিত? অন্যান্য উত্তরগুলি অনুরূপ সমাধানটি আরও ভালভাবে ব্যাখ্যা করে এবং এটিকে দেখে এটি বুঝতে পেরেছিলাম যে এটি ঠিক সেই জাতীয় উত্তর before
সেবি

3

হতে পারে আমি এটি মিস করেছি, তবে ভেরিয়েবলগুলি এখানে আরও আলোচনা করা হয়নি বলে আসল প্রশ্ন (গুলি) এর এই পৃষ্ঠায় আমি একটি সম্পূর্ণ উত্তর খুঁজে পাইনি। সুতরাং আমাকে অনুসন্ধানে যেতে হবে।

যেহেতু আমাকে এখনও মন্তব্য করার অনুমতি নেই, আমাকে এখানে আমার উপসংহার যোগ করতে দিন। আমি নিশ্চিত যে এই পৃষ্ঠায় অ্যাক্সেস করার সময় কেবল আমিই এতে আগ্রহী নই:

 >>>myString = 'Hello World'
 >>>end = 5

 >>>myString[2:end]
 'llo'

আপনি যদি প্রথম অংশটি ছেড়ে যান তবে আপনি পাবেন

 >>>myString[:end]
 'Hello' 

এবং যদি আপনি এটি ছেড়ে চলে যান: মাঝখানে পাশাপাশি আপনি সহজতম স্ট্রিং পেয়েছেন, যা 5 তম অক্ষর হবে (0 দিয়ে শুরু করা গণনা, সুতরাং এটি ক্ষেত্রে ফাঁকা):

 >>>myString[end]
 ' '

1

ঠিক আছে, আমি এমন একটি পরিস্থিতি পেয়েছি যেখানে পাইথনে পিএইচপি স্ক্রিপ্টটি অনুবাদ করার দরকার ছিল এবং এর অনেকগুলি ব্যবহার রয়েছে substr(string, beginning, LENGTH)
যদি আমি পাইথনকে বেছে নিই তবে আমাকে অনেকগুলি শেষ সূচক string[beginning:end]গণনা করতে হবে , তাই সহজ উপায়টি ব্যবহার করা ছিল , এটি আমাকে অনেক ঝামেলা বাঁচিয়েছিল।string[beginning:][:length]


0

হার্ডকোডযুক্ত সূচকগুলি নিজেই ব্যবহার করা গোলযোগ হতে পারে।

এটি এড়াতে পাইথন একটি অন্তর্নির্মিত বস্তু সরবরাহ করে slice()

string = "my company has 1000$ on profit, but I lost 500$ gambling."

আমরা যদি জানতে চাই যে আমি কত টাকা রেখেছি।

সাধারণ সমাধান:

final = int(string[15:19]) - int(string[43:46])
print(final)
>>>500

টুকরা ব্যবহার:

EARNINGS = slice(15, 19)
LOSSES = slice(43, 46)
final = int(string[EARNINGS]) - int(string[LOSSES])
print(final)
>>>500

স্লাইস ব্যবহার করে আপনি পঠনযোগ্যতা অর্জন করুন।


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