ফাঁকা স্ট্রিংগুলি বিভক্ত () ফলাফলগুলিতে কেন ফিরে আসে?


120

বিন্দু কি '/segment/segment/'.split('/')ফিরে ['', 'segment', 'segment', '']?

খালি উপাদান লক্ষ্য করুন। আপনি যদি কোনও ডিলিমিটারে বিভক্ত হয়ে যাচ্ছেন যা অবস্থানের এক এবং স্ট্রিংয়ের একেবারে শেষের দিকে ঘটে, তবে প্রতিটি প্রান্ত থেকে খালি স্ট্রিংটি ফিরে পাওয়ার জন্য অতিরিক্ত মানটি আপনাকে কী দেয়?


1
আমার একই প্রশ্ন আছে এবং এটি দীর্ঘ সময় অনুসন্ধান করেছি। এখন আমি বুঝতে পারি যে খালি ফলাফলগুলি সত্যই গুরুত্বপূর্ণ। আপনার প্রশ্নের জন্য ধন্যবাদ।
এমেরালদিউ

2
একটি সমাধান হ'ল strip()বিভক্ত হওয়ার আগে স্ট্রিং থেকে শীর্ষস্থানীয় এবং পিছনে বিভক্ত অক্ষরগুলি ফালা ব্যবহার করার জন্য:'/segment/segment/'.strip('/').split('/')
পিকম্ব

উত্তর:


178

str.splitপরিপূরক str.join, তাই

"/".join(['', 'segment', 'segment', ''])

আপনাকে আসল স্ট্রিং ফিরিয়ে আনে

যদি খালি স্ট্রিংগুলি না থাকে তবে প্রথম এবং শেষটি এর '/'পরে নিখোঁজ হবেjoin()


11
সহজ, তবে পুরো প্রশ্নের উত্তর দেয়।
orokusaki

আমি অবাক হয়ে জানতে পেরেছিলাম যে কোঁকড়ানো উদ্ধৃতিগুলি পাইথনে আসলে বৈধ ... তবে, তবে ... কীভাবে? দস্তাবেজগুলি এটি উল্লেখ করেছে বলে মনে হয় না।
টিম পিটজ্যাকার

@ টিম, আমার কী ধারণা নেই যে এই উদ্ধৃতিগুলি কীভাবে সেখানে পেয়েছে: /
জন লা রোয়

7
তাহলে, আপনি কি মাইক্রোসফ্ট ওয়ার্ডকে আপনার পাইথন আইডিই হিসাবে ব্যবহার করছেন না? :)
টিম পিটজ্যাকার

1
@ aaa90210 কে বলেছে যে সহজ উত্তরগুলি সেরা ছিল না? উত্তরটি কীভাবে সহজ ছিল তা সম্পর্কে এটি একটি মন্তব্য (প্রথমত, 5 বছর আগে), তবে পুরো প্রশ্নের উত্তর দিয়েছিল। একটি বাক্যে "তবে" ব্যবহার করা খারাপ কিছু বোঝায় না। একটি সহজ-সরল উত্তর হতে পারে আরও সম্পূর্ণ উত্তর (যেমন প্রাসঙ্গিক সিদ্ধান্ত বা উল্লিখিত কার্যকারিতা সম্পর্কিত একটি পিইপি সহ)।
orokusaki

88

আরও সাধারণভাবে, split()ফলাফলগুলিতে ফিরে আসা খালি স্ট্রিংগুলি সরাতে , আপনি filterফাংশনটি দেখতে চাইতে পারেন ।

উদাহরণ:

filter(None, '/segment/segment/'.split('/'))

আয়

['segment', 'segment']

3
এর জন্য আপনাকে ধন্যবাদ, আমি জানি না কেন এই উত্তরটি এতদূর নিচে রয়েছে, বাকি সমস্ত কিছুই প্রাথমিক জিনিস।
বুড়ো

6
যদি আউটপুট হিসাবে ফিল্টার অবজেক্ট পাওয়ার পরিবর্তে কোনও তালিকায় ফলাফল সংগ্রহ করতে ইচ্ছুক হয় তবে পুরো ফিল্টার কাঠামোটি এতে রেখে দিন list(...)
টিম ভিসি

29

এখানে দুটি প্রধান বিষয় বিবেচনা করতে হবে:

  • এর '/segment/segment/'.split('/')সমান হবে ['segment', 'segment']বলে আশা করা যুক্তিসঙ্গত, তবে তারপরে এটি তথ্য হারিয়ে যায়। যদি split()আপনি যেভাবে কাজ করেন তবে যদি আমি তা আপনাকে বলি তবে আপনি কী বলতে a.split('/') == ['segment', 'segment']পারবেন তা বলতে পারেন না a
  • এর ফলাফল কী হওয়া উচিত 'a//b'.split()? ['a', 'b']?, বা ['a', '', 'b']? অর্থাৎ, split()সংলগ্ন সীমানারগুলি একত্রিত করা উচিত ? যদি এটি করা উচিত হয় তবে কোনও চরিত্রের দ্বারা সীমাবদ্ধ এমন ডেটা পার্স করা খুব শক্ত হবে এবং কিছু ক্ষেত্র খালি থাকতে পারে। আমি নিশ্চিত অনেকেই কে মোটামুটি আছি কি করতে উপরে ক্ষেত্রে জন্য ফলাফলে খালি মান চাই!

শেষ পর্যন্ত, এটি দুটি জিনিস থেকে সিদ্ধ হয়:

ধারাবাহিকতা: যদি আমার nসীমানা থাকে তবে আমি এর পরে মানগুলি aপাই ।n+1split()

জটিল জিনিসগুলি করা সহজ এবং সহজ জিনিসগুলি করা সহজ হওয়া উচিত: আপনি যদি খালি স্ট্রিংগুলিকে ফলস্বরূপ অগ্রাহ্য করতে চান তবে আপনি split()সর্বদা এটি করতে পারেন:

def mysplit(s, delim=None):
    return [x for x in s.split(delim) if x]

তবে যদি কেউ শূন্য মানগুলিকে উপেক্ষা করতে না চায় তবে তার পক্ষে সক্ষম হওয়া উচিত

ভাষাটির একটি সংজ্ঞা বাছাই করতে হবে split()- ডিফল্ট হিসাবে প্রত্যেকের প্রয়োজনীয়তা মেটানোর জন্য অনেকগুলি বিভিন্ন ব্যবহারের কেস রয়েছে। আমি মনে করি পাইথনের পছন্দটি একটি ভাল এবং সবচেয়ে যুক্তিযুক্ত। (একদিকে যেমন, আমি সি এর পছন্দ না করি তার strtok()একটি কারণ এটি সংলগ্ন সীমানারগুলিকে একীভূত করে, এর সাথে গুরুতর বিশদকরণ / টোকনাইজেশন করা অত্যন্ত কঠিন করে তোলে))

একটি ব্যতিক্রম আছে: a.split()যুক্তি ছাড়াই ধারাবাহিক সাদা স্থানকে চেপে ধরে, তবে যে কেউ এই যুক্তি দিতে পারে যে এই ক্ষেত্রে এটি করা সঠিক জিনিস। আপনি যদি আচরণটি না চান তবে আপনি সর্বদা এটি করতে পারেন a.split(' ')


যারা ডুপ্লিকেট ফাঁকা স্থানগুলি দ্রুততর করতে, তারপরে বিভক্ত হওয়া বা বিভক্ত হওয়া এবং কেবল খালি খালি স্ট্রিংগুলি গ্রহণ করা দ্রুত কিনা তা অবাক করে python3 -m timeit "import re ; re.sub(' +', ' foo bar baz ', '').split(' ')"যাচ্ছেন, আমি যা পেয়েছি তা এখানে: -> লুপ প্রতি 875 এনসিএস; python3 -m timeit "[token for token in ' foo bar baz '.split(' ') if token]"-> লুপ প্রতি 616 এনসিএস
s3cur3

8

রয়ে x.split(y)সবসময় একটি তালিকা আসতে 1 + x.count(y)আইটেম একটি মূল্যবান নিয়মানুবর্তিতা হয় - যেমন @ gnibbler ইতিমধ্যে উল্লেখ চলছে তা এটা তোলে splitএবং joinএকে অপরের সঠিক inverses (যেমন তারা স্পষ্টত হওয়া উচিত), এটি অবিকল বিভেদক যোগদান রেকর্ডের সব ধরণের শব্দার্থবিদ্যা (মানচিত্র যেমন csvফাইল লাইন [[বিষয়গুলির উদ্ধৃতি দেওয়ার জাল]], /etc/groupইউনিক্সের লাইনগুলি এবং এই জাতীয়), এটি (রোমানের উত্তর হিসাবে উল্লিখিত হিসাবে) নিখুঁত বনাম আপেক্ষিক পাথ (ফাইল পাথ এবং ইউআরএল) এর সহজ চেকগুলিকে অনুমতি দেয়, এবং তাই এগিয়ে।

এটি দেখার আরেকটি উপায় হ'ল আপনার লাভের জন্য উইন্ডো থেকে অজানা তথ্য টস করা উচিত নয়। এর x.split(y)সমতুল্য তৈরিতে কী লাভ হবে x.strip(y).split(y)? কিছুই, অবশ্যই - এটি সহজ দ্বিতীয় ফর্ম ব্যবহার করার জন্য যে এর আপনি কি বলতে চাইছেন, কিন্তু যদি প্রথম ফর্ম ইচ্ছামত দ্বিতীয় অর্থ বলিয়া গণ্য করা হয়, আপনি কাজ অনেক কাজ করতে যখন আপনি আছে চাই যখন না প্রথমটি চান ( যা পূর্ববর্তী অনুচ্ছেদে নির্দেশ করে যেমন বিরল থেকে অনেক দূরে)।

তবে প্রকৃতপক্ষে, গাণিতিক নিয়মিততার বিবেচনা করা হ'ল সহজ এবং সর্বাধিক সাধারণ উপায় যা আপনি নিজেকে প্যাসেবল এপিআই ডিজাইন করতে শেখাতে পারেন। একটি পৃথক উদাহরণ গ্রহণ করার জন্য, কোনও বৈধ xএবং এটির জন্য এটি খুব গুরুত্বপূর্ণ যে y x == x[:y] + x[y:]- তাত্ক্ষণিকভাবে নির্দেশ করে যে কেন একটি চিট কাটানোর এক চরম বাদ দেওয়া উচিত । অদম্য দৃser়তার সাথে আপনি যে সূত্রটি নির্ধারণ করতে পারবেন, ততই সমান এটি হ'ল ফলস্বরূপ শব্দার্থবিজ্ঞানগুলি যা আপনার বাস্তব জীবনের ব্যবহারের জন্য প্রয়োজন তা হ'ল - রহস্যময় সত্যের অংশটি যে গণিতগুলি মহাবিশ্বের সাথে কাজ করার ক্ষেত্রে খুব কার্যকর।

একটি splitউপভাষার জন্য আক্রমণকারী গঠনের চেষ্টা করুন যাতে নেতৃস্থানীয় এবং অনুগামী ডিলিমিটর বিশেষ-ক্ষেত্রেযুক্ত হয় ... উদাহরণস্বরূপ: স্ট্রিং পদ্ধতিগুলি যেমন isspaceসর্বাধিক সহজ নয় - x.isspace()এর সমতুল্য x and all(c in string.whitespace for c in x)- সেই নির্বোধ নেতৃত্বের x andকারণেই আপনি নিজেকে প্রায়শই কোডিং খুঁজে পান not x or x.isspace(), সরলতার দিকে ফিরে যেতে যা স্ট্রিং পদ্ধতিতে ডিজাইন করা উচিত ছিলis... (যার মাধ্যমে খালি স্ট্রিংটি "আপনি চান এমন কিছু" - রাস্তার ঘোড়া-ইন্দ্রিয়ের বিপরীতে সম্ভবত [[শূন্যের মতো খালি সেট) & সি, সর্বদা বেশিরভাগ লোককে বিভ্রান্ত করেছে ;-)]] তবে পুরোপুরি সুস্পষ্টভাবে পরিশোধিত গাণিতিক সাধারণ জ্ঞান অনুসারে! -)।


5

আমি নিশ্চিত না আপনি কী ধরণের উত্তর খুঁজছেন? আপনার তিনটি ডিলিমিটার রয়েছে বলে আপনি তিনটি ম্যাচ পান। আপনি যদি খালিটি না চান তবে কেবল ব্যবহার করুন:

'/segment/segment/'.strip('/').split('/')

4
-1 কারণ আপনি তিনটি নয় চারটি ম্যাচ পান এবং এছাড়াও এটি সত্যই প্রশ্নের উত্তর দেয় না।
রোমান

1
নেগ প্রতিরোধ করার জন্য +1 .. তিনি বলেননি যে আপনি তিনটি ফলাফল ফিরে পাবেন। তিনি "তিনটি সীমান্তকারক" এর জন্য "তিনটি ম্যাচ" বলেছেন, এটি আমার কাছে যৌক্তিক মনে হচ্ছে। তবে আপনি কোনও কিছুর "চারটি ম্যাচ" পান না। যদিও আপনার ফলাফলটিতে আপনি "চারটি উপাদান" ফিরে পেয়েছেন। এছাড়াও, এটি সরাসরি "কেন" এর উত্তর দেয় না, তবে তিনি যা চান তা পাওয়ার জন্য এটি একটি সহজ উপায় সরবরাহ করে ... যা আমি ভাবি না যে ডাউন ডাউনের দাবিদার। আপনি যদি কাউকে নিটপিক করতে চলেছেন (ডাউনটোট সহ, কম নয়) দয়া করে আরও সতর্ক হন! চিয়ার্স! 8।)
কোডিব্রাউন

@ ওয়াসাচউইজার্ড স্পষ্টতার জন্য ধন্যবাদ। আমি সংশোধন এবং সুপারিশ প্রশংসা করি। দুর্ভাগ্যক্রমে, এখন আমার ভোট লক হয়ে গেছে এবং পরিবর্তন করা যায় না।
রোমান

আমি আপনার সমাধানটি পছন্দ করি - ফালাটি খালি ফলাফলটি সরিয়ে ফেলার জন্য ভাগ করুন
নাম জি ভিইউ

5

ঠিক আছে, এটি আপনাকে জানায় যে সেখানে একটি ডিলিমিটার ছিল। সুতরাং, 4 টি ফলাফল দেখার ফলে আপনাকে জানতে পারে যে আপনার কাছে 3 টি ডিলিমিটার ছিল। এটি আপনাকে পাইথন খালি উপাদানগুলিকে বাদ দেওয়ার পরিবর্তে এই তথ্যটি দিয়ে যা কিছু করার ক্ষমতা দেয় এবং তারপরে আপনাকে যদি এটির জানা দরকার তবে ডিলিমিটারগুলি শুরু করতে বা শেষ করার জন্য আপনাকে ম্যানুয়ালি পরীক্ষা করতে সহায়তা করে।

সাধারণ উদাহরণ: বলুন আপনি নিরঙ্কু বনাম সম্পর্কিত ফাইল সম্পর্কিত নাম যাচাই করতে চান। আপনার ফাইলনামের প্রথম অক্ষরটি কী তা পরীক্ষা না করেও আপনি বিভাজন দিয়ে এটি সব করতে পারেন।


1

এই সর্বনিম্ন উদাহরণ বিবেচনা করুন:

>>> '/'.split('/')
['', '']

splitডিলিমিটারের আগে এবং পরে অবশ্যই আপনাকে দিতে হবে '/', তবে অন্য কোনও চরিত্র নেই। সুতরাং এটি হয়েছে আপনি খালি স্ট্রিং, যা টেকনিক্যালি পূর্বে এবং অনুসরণ দিতে '/', কারণ '' + '/' + '' == '/'

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