[Python] मैं कैसे पायथन में एक स्ट्रिंग को मज़बूती से विभाजित कर सकता हूं?


Answers

चूंकि आप पायथन 3 पर हैं, इसलिए यह आसान है। पीईपी 3132 ने ट्यूपल्स को निर्दिष्ट करते समय वाक्यविन्यास का एक स्वागत योग्य सरलीकरण शुरू किया - विस्तारित चलने योग्य अनपैकिंग । अतीत में, यदि ट्यूपल में चर को असाइन करते हैं, तो काम के बायीं ओर की वस्तुओं की संख्या ठीक उसी पर बराबर होनी चाहिए।

अजगर 3 में हम किसी स्टार के साथ prefixing * सूची के रूप में बाईं ओर किसी भी चर को निर्दिष्ट कर सकते हैं। यह कई मानों को पकड़ लेगा, जैसा कि यह हो सकता है, जबकि अभी भी चर को अपने दाहिनी ओर बांट दिया जाता है (इसलिए इसे सहीतम वस्तु की आवश्यकता नहीं है)। यह कई बुरा स्लाइस से बचा जाता है जब हमें ट्यूपल की लंबाई नहीं पता।

a, *b = "foo".split(":")  
print("a:", a, "b:", b)

देता है:

a: foo b: []

निम्नलिखित टिप्पणियों और चर्चा को संपादित करें:

पर्ल संस्करण की तुलना में, यह काफी अलग है, लेकिन यह पायथन (3) तरीका है। पर्ल संस्करण की तुलना में, re.split() अधिक समान होगा, हालांकि एक एकल अक्षर के चारों ओर विभाजन के लिए आरई इंजन को लागू करना एक अनावश्यक ओवरहेड है।

पायथन में कई तत्वों के साथ:

s = 'hello:world:sailor'
a, *b = s.split(":")
print("a:", a, "b:", b)

देता है:

a: hello b: ['world', 'sailor']

हालांकि पर्ल में:

my $s = 'hello:world:sailor';
my ($a, $b) = split /:/, $s;
print "a: $a b: $b\n";

देता है:

a: hello b: world

यह देखा जा सकता है कि पर्ल में अतिरिक्त तत्वों को नजरअंदाज किया जाता है या खो जाता है। यदि आवश्यक हो तो यह पायथन में दोहराना काफी आसान है:

s = 'hello:world:sailor'
a, *b = s.split(":")
b = b[0]
print("a:", a, "b:", b)

इसलिए, a, *b = s.split(":") पर्ल के बराबर होगा

my ($a, @b) = split /:/, $s;

एनबी: हमें पर्ल के सामान्य में $a और $b उपयोग नहीं करना चाहिए क्योंकि sort साथ उपयोग किए जाने पर उनका विशेष अर्थ है मैंने उन्हें अजगर उदाहरण के साथ स्थिरता के लिए उपयोग किया है।

अजगर में अपनी आस्तीन की एक अतिरिक्त चाल है, हम बाईं ओर टपल में किसी भी तत्व को खोल सकते हैं:

s = "one:two:three:four"
a, *b, c = s.split(':')
print("a:", a, "b:", b, "c:", c)

देता है:

a: one b: ['two', 'three'] c: four

जबकि पर्ल समतुल्य में, सरणी ( @b ) लालची है, और स्केलर $c undef :

use strict;
use warnings;

my $s = 'one:two:three:four';
my ($a, @b, $c) = split /:/, $s;
print "a: $a b: @b c: $c\n";

देता है:

Use of uninitialized value $c in concatenation (.) or string at gash.pl line 8.
a: one b: two three four c: 
Question

पर्ल में मैं कर सकता हूँ:

my ($x, $y) = split /:/, $str;

और यह काम करेगा कि स्ट्रिंग में पैटर्न शामिल है या नहीं।

पायथन में, हालांकि यह काम नहीं करेगा:

a, b = "foo".split(":")  # ValueError: not enough values to unpack

ऐसे मामलों में त्रुटियों को रोकने के लिए वैधानिक तरीका क्या है?




split हमेशा एक सूची वापस करेगा a, b = ... हमेशा सूची लंबाई दो होने की उम्मीद होगी आप जैसे कुछ उपयोग कर सकते हैं l = string.split(':'); a = l[0]; ... l = string.split(':'); a = l[0]; ... l = string.split(':'); a = l[0]; ...

यहां एक एक लाइनर है: a, b = (string.split(':') + [None]*2)[:2]