प्रश्न: मैं एक स्ट्रिंग में लाइनें प्राप्त करने के लिए विभाजन ('\ n') का उपयोग कर रहा हूं, और पाया कि '' .plplit () खाली सूची [] लौटाता है, जबकि '' .split ('\ n') रिटर्न [''] ।
Str.split () विधि दो एल्गोरिदम है। यदि कोई तर्क नहीं दिया जाता है, तो यह व्हाट्सएप के दोहराया रनों पर विभाजित होता है। हालाँकि, यदि कोई तर्क दिया जाता है, तो इसे एक एकल सीमांकक के रूप में माना जाता है जिसमें बार-बार रन नहीं होते हैं।
खाली स्ट्रिंग को विभाजित करने के मामले में, पहला मोड (कोई तर्क नहीं) एक खाली सूची लौटाएगा क्योंकि व्हॉट्सएप खाया जाता है और परिणाम सूची में डालने के लिए कोई मूल्य नहीं हैं।
इसके विपरीत, दूसरा मोड (जैसे एक तर्क के साथ \n
) पहले खाली क्षेत्र का उत्पादन करेगा। विचार करें कि क्या आपने लिखा था '\n'.split('\n')
, तो आपको दो फ़ील्ड मिलेंगे (एक विभाजन, आपको दो हिस्से देता है)।
प्रश्न: क्या इस तरह के अंतर का कोई विशेष कारण है?
यह पहला मोड उपयोगी है जब डेटा को व्हॉट्सएप की परिवर्तनीय मात्रा वाले कॉलम में संरेखित किया जाता है। उदाहरण के लिए:
>>> data = '''\
Shasta California 14,200
McKinley Alaska 20,300
Fuji Japan 12,400
'''
>>> for line in data.splitlines():
print line.split()
['Shasta', 'California', '14,200']
['McKinley', 'Alaska', '20,300']
['Fuji', 'Japan', '12,400']
दूसरा मोड सीमांकित डेटा जैसे कि CSV के लिए उपयोगी है जहां बार-बार अल्पविराम खाली क्षेत्रों को दर्शाता है। उदाहरण के लिए:
>>> data = '''\
Guido,BDFL,,Amsterdam
Barry,FLUFL,,USA
Tim,,,USA
'''
>>> for line in data.splitlines():
print line.split(',')
['Guido', 'BDFL', '', 'Amsterdam']
['Barry', 'FLUFL', '', 'USA']
['Tim', '', '', 'USA']
ध्यान दें, परिणाम फ़ील्ड की संख्या सीमांकक की संख्या से अधिक है। रस्सी काटने की सोचो। यदि आप कोई कटौती नहीं करते हैं, तो आपके पास एक टुकड़ा है। एक कट कर, दो टुकड़े देता है। दो कट बनाते हैं, तीन टुकड़े करते हैं। और इसलिए यह पायथन के str.split (सीमांकक) विधि के साथ है:
>>> ''.split(',') # No cuts
['']
>>> ','.split(',') # One cut
['', '']
>>> ',,'.split(',') # Two cuts
['', '', '']
प्रश्न: और क्या किसी स्ट्रिंग में लाइनों को गिनने का कोई और सुविधाजनक तरीका है?
हां, कुछ आसान तरीके हैं। एक str.count () का उपयोग करता है और दूसरा str.splitlines () का उपयोग करता है । दोनों तरह से एक ही जवाब देंगे जब तक कि अंतिम लाइन गायब न हो \n
। यदि अंतिम न्यूलाइन गायब है, तो str.splitlines दृष्टिकोण सटीक उत्तर देगा। एक तेज़ तकनीक जो सटीक भी है, गिनती पद्धति का उपयोग करती है लेकिन फिर इसे अंतिम न्यूलाइन के लिए सही करती है:
>>> data = '''\
Line 1
Line 2
Line 3
Line 4'''
>>> data.count('\n') # Inaccurate
3
>>> len(data.splitlines()) # Accurate, but slow
4
>>> data.count('\n') + (not data.endswith('\n')) # Accurate and fast
4
@ काज से प्रश्न: एक ही फ़ंक्शन में बिल्ली को दो अलग-अलग एल्गोरिदम जूता-सींग क्यों दिया जाता है?
Str.split के लिए हस्ताक्षर लगभग 20 साल पुराना है, और उस युग के कई एपीआई सख्ती से व्यावहारिक हैं। सही नहीं है, विधि हस्ताक्षर या तो "भयानक" नहीं है। अधिकांश भाग के लिए, गुइडो के एपीआई डिजाइन विकल्प समय की कसौटी पर खरे उतरे हैं।
वर्तमान एपीआई फायदे के बिना नहीं है। स्ट्रिंग पर विचार करें जैसे:
ps_aux_header = "USER PID %CPU %MEM VSZ"
patient_header = "name,age,height,weight"
जब इन तारों को खेतों में तोड़ने के लिए कहा जाता है, तो लोग एक ही अंग्रेजी शब्द "स्प्लिट" का उपयोग करते हुए दोनों का वर्णन करते हैं। जब fields = line.split()
या जैसे कोड को पढ़ने के लिए कहा जाता है fields = line.split(',')
, तो लोग "क्षेत्रों में एक रेखा को विभाजित करते हैं" जैसे कथनों की सही व्याख्या करते हैं।
माइक्रोसॉफ्ट एक्सेल के टेक्स्ट-टू-कॉलम टूल ने एक समान एपीआई विकल्प बनाया और दोनों विभाजन एल्गोरिदम को एक ही टूल में शामिल किया। लोग मानसिक रूप से मॉडल-विभाजन को एकल अवधारणा के रूप में देखते हैं, भले ही एक से अधिक एल्गोरिथ्म शामिल हो।