2012-05-13 4 views
24

में उत्परिवर्तनीय तार कृपया, क्या आप पाइथन लाइब्रेरी के बारे में जानते हैं जो परिवर्तनीय तार प्रदान करता है? Google आश्चर्यजनक रूप से कुछ परिणाम लौटा। मुझे मिली केवल उपयोग करने योग्य लाइब्रेरी http://code.google.com/p/gapbuffer/ है जो सी में है लेकिन मैं इसे शुद्ध पायथन में लिखना पसंद करूंगा।पायथन

संपादित करें: प्रतिक्रियाओं के लिए धन्यवाद लेकिन मैं कुशल लाइब्रेरी के बाद हूं। यही है, ''.join(list) काम कर सकता है लेकिन मैं कुछ और अनुकूलित करने की उम्मीद कर रहा था। इसके अलावा, इसे नियमित सामानों को नियमित स्ट्रिंग्स और यूनिकोड की तरह करना है।

+5

सूचियाँ इस बात के लिए बहुत अच्छी तरह से काम करते हैं जोड़ा जा सकता है उद्देश्य। –

+0

कुछ लिंक: [LINK1] (http://mail.python.org/pipermail/tutor/2003-August/024485.html), [LINK2] (http://www.skymind.com/~ocrow/ python_string /) – digEmAll

+4

क्या आप कृपया समझा सकते हैं, आपको म्यूटेबल तारों की आवश्यकता क्यों है? उपयोग का मामला क्या है? –

उत्तर

19

अजगर परिवर्तनशील अनुक्रम प्रकार में bytearray देख this link

+2

बफर केवल पढ़े जाते हैं। – Marcin

+1

धन्यवाद मार्किन, दिखाता है कि मैं कितनी बार बफर का उपयोग करता हूं ... –

+0

मुझे यकीन नहीं है कि @Marcin किस बात का जिक्र कर रहा है क्योंकि बाइटरेरे आपको बाइटियर के टुकड़े पर एक नया मान निर्दिष्ट करने की अनुमति देता है। – jonathanrocher

11
class MutableString(object): 
    def __init__(self, data): 
     self.data = list(data) 
    def __repr__(self): 
     return "".join(self.data) 
    def __setitem__(self, index, value): 
     self.data[index] = value 
    def __getitem__(self, index): 
     if type(index) == slice: 
      return "".join(self.data[index]) 
     return self.data[index] 
    def __delitem__(self, index): 
     del self.data[index] 
    def __add__(self, other): 
     self.data.extend(list(other)) 
    def __len__(self): 
     return len(self.data) 

... और इतने पर, और बहुत आगे है।

आप स्ट्रिंगियो, बफर, या बायटेयर्रे को भी उपclass कर सकते हैं।

+0

'get' जैसे regex और स्ट्रिंग विधियों का उपयोग करने में सक्षम होने के लिए आपको' ऑब्जेक्ट 'के बजाय 'str' से उप-वर्ग की आवश्यकता है। –

+0

सुधार: regex और 'find' केवल मूल स्ट्रिंग पर काम करते हैं। '__setitem__'are के माध्यम से किए गए संशोधनों ने उपेक्षा की। MutableStrings पर regex का उपयोग करने का कोई तरीका है? –

+0

आप 're.match (अभिव्यक्ति, repr (mutable_string))' –

15

इससे आपको स्ट्रिंग में वर्णों को कुशलतापूर्वक बदलने की अनुमति मिल जाएगी। हालांकि आप स्ट्रिंग लंबाई को बदल नहीं सकते हैं।

>>> import ctypes 

>>> a = 'abcdefghijklmn' 
>>> mutable = ctypes.create_string_buffer(a) 
>>> mutable[5:10] = ''.join(reversed(list(mutable[5:10].upper()))) 
>>> a = mutable.value 
>>> print `a, type(a)` 
('abcdeJIHGFklmn', <type 'str'>) 
+2

** बीई वॉर्न ** ** बफर में टर्मिनेटर को इसकी रिपोर्ट 'लेन() 'में शामिल किया गया है। ** यह नकारात्मक सूचकांक के साथ स्लाइस तोड़ देगा ** जब तक आप प्रत्येक नकारात्मक अनुक्रमणिका में अतिरिक्त '-1' जोड़ते हैं। (यूनिकोड बफर के लिए, यह '-1' भी है, क्योंकि इन प्रकारों के लिए 'लेन' और स्लाइस इंडेक्स वर्णों में हैं।) –

1

कैसे के बारे में बस उप classing (पायथन में अस्थिरता के लिए प्रमुख उदाहरण) list?

class CharList(list): 

    def __init__(self, s): 
     list.__init__(self, s) 

    @property 
    def list(self): 
     return list(self) 

    @property 
    def string(self): 
     return "".join(self) 

    def __setitem__(self, key, value): 
     if isinstance(key, int) and len(value) != 1: 
      cls = type(self).__name__ 
      raise ValueError("attempt to assign sequence of size {} to {} item of size 1".format(len(value), cls)) 
     super(CharList, self).__setitem__(key, value) 

    def __str__(self): 
     return self.string 

    def __repr__(self): 
     cls = type(self).__name__ 
     return "{}(\'{}\')".format(cls, self.string) 

यदि आप इसे मुद्रित करना चाहते हैं या स्ट्रिंग प्रस्तुति के लिए सक्रिय रूप से पूछना चाहते हैं तो यह केवल स्ट्रिंग पर सूची में शामिल हो जाता है। उत्परिवर्तन और विस्तार छोटा है, और उपयोगकर्ता जानता है कि यह केवल एक सूची है क्योंकि इसे पहले से कैसे किया जाए।

उदाहरण उपयोग:

s = "te_st" 
c = CharList(s) 
c[1:3] = "oa" 
c += "er" 
print C# prints "toaster" 
print c.list # prints ['t', 'o', 'a', 's', 't', 'e', 'r'] 

निम्नलिखित तय हो गई है, नीचे अद्यतन देखें।

एक (हल करने योग्य) चेतावनी है: कोई जांच नहीं है (अभी तक) कि प्रत्येक तत्व वास्तव में एक चरित्र है। यह कम से कम सब कुछ के लिए मुद्रण विफल हो जाएगा लेकिन स्ट्रिंग्स। एक CharList आइटम पर

कस्टम __setitem__ साथ

[नीचे दिए गए कोड उदाहरण देखें], लंबाई की एक स्ट्रिंग बताए = 1 एक ValueError बढ़ा देंगे: हालांकि, उन में शामिल हो गए जा सकता है और इस तरह अजीब स्थितियों का कारण हो सकता। बाकी सब कुछ अभी भी स्वतंत्र रूप से असाइन किया जा सकता है लेकिन string.join() ऑपरेशन के कारण मुद्रण करते समय TypeError: sequence item n: expected string, X found बढ़ाएगा। अगर वह पर्याप्त नहीं है, आगे के चेक आसानी से (संभावित भी __setslice__ करने के लिए या (प्रदर्शन अलग हो सकता है ?!) collections.Sequence के आधार वर्ग स्विचिंग, cf here द्वारा)

s = "test" 
c = CharList(s) 
c[1] = "oa" 
# with custom __setitem__ a ValueError is raised here! 
# without custom __setitem__, we could go on: 
c += "er" 
print C# prints "toaster" 
# this looks right until here, but: 
print c.list # prints ['t', 'oa', 's', 't', 'e', 'r']