2010-10-12 8 views
56

बिल्ट-इन फ़ंक्शन slice का उपयोग क्या है और मैं इसका उपयोग कैसे कर सकता हूं?
पायथनिक स्लाइसिंग का सीधा तरीका मुझे पता है - l1[start:stop:step]। मैं जानना चाहता हूं कि मेरे पास स्लाइस ऑब्जेक्ट है, तो मैं इसका उपयोग कैसे करूं?पाइथन स्लाइस कैसे करें, मुझे पाइथन स्लाइस पता है लेकिन मैं इसके लिए अंतर्निहित स्लाइस ऑब्जेक्ट का उपयोग कैसे कर सकता हूं?

+1

यह मेरे लिए काम करता था। डीफ __slice __ (स्वयं, प्रारंभ = कोई नहीं, अंत = कोई नहीं, चरण = कोई नहीं): वापस self.obj [स्लाइस (प्रारंभ, अंत, चरण)] – user2290820

उत्तर

72

आप एक ही क्षेत्रों के साथ टुकड़ा को फोन करके एक टुकड़ा बनाने यदि कर आप का प्रयोग करेंगे [शुरू: अंत: कदम] अंकन:

sl = slice(0,4) 

टुकड़ा का उपयोग करने के लिए, बस इसे पारित जैसे कि यह सूचकांक थे एक सूची या स्ट्रिंग में:

>>> s = "ABCDEFGHIJKL" 
>>> sl = slice(0,4) 
>>> print(s[sl]) 
'ABCD' 

मान लें कि आपके पास निश्चित-लंबाई वाले टेक्स्ट फ़ील्ड की एक फ़ाइल है। आप इस फ़ाइल में प्रत्येक "रिकॉर्ड" से मूल्यों को आसानी से निकालने के लिए स्लाइस की एक सूची परिभाषित कर सकते हैं।

data = """\ 
0010GEORGE JETSON 12345 SPACESHIP ST HOUSTON  TX 
0020WILE E COYOTE 312 ACME BLVD  TUCSON  AZ 
0030FRED FLINTSTONE 246 GRANITE LANE  BEDROCK  CA 
0040JONNY QUEST  31416 SCIENCE AVE PALO ALTO  CA""".splitlines() 


fieldslices = [slice(*fielddef) for fielddef in [ 
    (0,4), (4, 21), (21,42), (42,56), (56,58), 
    ]] 
fields = "id name address city state".split() 

for rec in data: 
    for field,sl in zip(fields, fieldslices): 
     print("{} : {}".format(field, rec[sl])) 
    print('') 

प्रिंटों:

id : 0010 
name : GEORGE JETSON  
address : 12345 SPACESHIP ST 
city : HOUSTON  
state : TX 

id : 0020 
name : WILE E COYOTE  
address : 312 ACME BLVD   
city : TUCSON   
state : AZ 

id : 0030 
name : FRED FLINTSTONE 
address : 246 GRANITE LANE  
city : BEDROCK  
state : CA 

id : 0040 
name : JONNY QUEST  
address : 31416 SCIENCE AVE  
city : PALO ALTO  
state : CA 
3

slice फ़ंक्शन slice objects देता है। स्लाइस ऑब्जेक्ट्स पाइथन के आंतरिक प्रकारों में से एक हैं, जिन्हें पढ़ने के प्रदर्शन के लिए अनुकूलित किया गया है - उनके सभी गुण केवल पढ़ने के लिए हैं।

slice बदलना डिफ़ॉल्ट व्यवहार को बदलना चाहते हैं तो उपयोगी हो सकता है। उदाहरण के लिए, lxml डोम तत्वों तक पहुंचने के लिए स्लाइस नोटेशन का उपयोग करता है (हालांकि, मैंने पुष्टि नहीं की है कि उन्होंने स्वयं को कैसे किया है)।

28

स्क्वायर एक अनुक्रम के बाद कोष्ठक या तो अनुक्रमण या टुकड़ा करने की क्रिया को निरूपित क्या कोष्ठक के अंदर के आधार पर:

>>> "Python rocks"[1] # index 
'y' 
>>> "Python rocks"[1:10:2] # slice 
'yhnrc' 
इन मामलों में से

दोनों __getitem__() विधि द्वारा नियंत्रित किया जाता है अनुक्रम (या __setitem__() यदि बराबर चिह्न के बाईं ओर है।) सूचकांक या टुकड़ा विधिओं को एक तर्क के रूप में पारित किया जाता है, और टी वह जिस तरह से पाइथन करता है वह स्लाइस नोटेशन को परिवर्तित कर रहा है, (1:10:2, इस मामले में) एक स्लाइस ऑब्जेक्ट में: slice(1,10,2)

तो अगर आप अपने खुद के अनुक्रम की तरह वर्ग को परिभाषित कर रहे हैं या किसी अन्य वर्ग के __getitem__ या __setitem__ या __delitem__ तरीकों अधिभावी, आप अगर यह एक int या एक slice, और इस प्रक्रिया के हिसाब से है निर्धारित करने के लिए सूचकांक तर्क का परीक्षण करने की जरूरत है: start, stop और step, और एक विधि:

def __getitem__(self, index): 
    if isinstance(index, int): 
     ... # process index as an integer 
    elif isinstance(index, slice): 
     start, stop, step = index.indices(len(self)) # index is a slice 
     ... # process slice 
    else: 
     raise TypeError("index must be int or slice") 

एक slice वस्तु तीन गुण होते हैं indices है, जो एक भी तर्क, वस्तु की लंबाई लेता है, और एक 3-टपल देता है: (start, stop, step)

5
>>> class sl: 
... def __getitem__(self, *keys): print keys 
...  
>>> s = sl() 
>>> s[1:3:5] 
(slice(1, 3, 5),) 
>>> s[1:2:3, 1, 4:5] 
((slice(1, 2, 3), 1, slice(4, 5, None)),) 
>>> 
+2

यह क्यों होता है पर स्पष्टीकरण के लिए नीचे डॉन का उत्तर देखें। – abc

+0

यह भी कहना फायदेमंद होगा कि '__getitem__' में कई स्लाइस पास किए जा सकते हैं: 's: 1: 2: 3, 1, 4: 5] => (टुकड़ा (1, 2, 3), 1 , टुकड़ा (4, 5, कोई नहीं)) '। – OozeMeister

संबंधित मुद्दे