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


Answers

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

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

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;

एनबी: हमें सामान्य पर्ल में $b और $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]; ... l = string.split(':'); a = l[0]; ...

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




Links