क्या Python में cons
के बराबर है? (2.5 से ऊपर कोई संस्करण)पाइथन में LISP विपक्ष
यदि हां, तो क्या यह बनाया गया है? या मुझे easy_install
एक मॉड्यूल प्राप्त करने की आवश्यकता है?
क्या Python में cons
के बराबर है? (2.5 से ऊपर कोई संस्करण)पाइथन में LISP विपक्ष
यदि हां, तो क्या यह बनाया गया है? या मुझे easy_install
एक मॉड्यूल प्राप्त करने की आवश्यकता है?
पायथन में, लिस्प-स्टाइल लिंक्ड सूचियों की तुलना में सरणी-आधारित list
कक्षा का उपयोग करना अधिक विशिष्ट है। लेकिन उनके बीच परिवर्तित करना बहुत मुश्किल नहीं है:
def cons(seq):
result = None
for item in reversed(seq):
result = (item, result)
return result
def iter_cons(seq):
while seq is not None:
car, cdr = seq
yield car
seq = cdr
>>> cons([1, 2, 3, 4, 5, 6])
(1, (2, (3, (4, (5, (6, None))))))
>>> iter_cons(_)
<generator object uncons at 0x00000000024D7090>
>>> list(_)
[1, 2, 3, 4, 5, 6]
सं। cons
लिस्प जैसी भाषाओं का कार्यान्वयन विवरण है; यह पायथन में किसी भी सार्थक अर्थ में मौजूद नहीं है।
इसलिए '[1, 2, [3, 4, 5, [4, 1]]] से '[1, 2, 3, 4' जैसे" condense "सूचियों का कोई तरीका नहीं है, 5, 4, 1] '? – tekknolagi
वहाँ है, लेकिन 'विपक्ष' यह नहीं है। देखें: http://stackoverflow.com/questions/406121/flattening-a-shallow-list-in-python – duskwuff
आप काफी तुच्छता से एक वर्ग है कि बर्ताव बहुत cons
तरह परिभाषित कर सकते हैं:
class Cons(object):
def __init__(self, car, cdr):
self.car = car
self.cdr = cdr
हालांकि यह एक बहुत ही 'दिग्गज' जिस तरह से बुनियादी डेटा संरचनाओं, जो अजगर के लिए अनुकूल नहीं है निर्माण करने के लिए है, इसलिए मैं करूंगा उम्मीद है कि परिणाम लिस्प में समान कुछ करने से अधिक CPU/स्मृति गहन हो।
ध्यान दें कि पायथन की सूचियां वैक्टर के रूप में लागू की जाती हैं, न कि लिंक्ड सूचियों के रूप में। आप lst.insert(0, val)
कर सकते हैं, लेकिन वह ऑपरेशन ओ (एन) है।
यदि आप एक डेटा संरचना चाहते हैं जो एक लिंक की गई सूची की तरह व्यवहार करे, तो Deque का उपयोग करने का प्रयास करें।
चेतावनी: नीचे दी गई सामग्री व्यावहारिक नहीं हो सकती है!
असल में, cons
को लिस्प में आदिम होने की आवश्यकता नहीं है, तो आप इसे λ के साथ बना सकते हैं। विवरण के लिए Use of lambda for cons/car/cdr definition in SICP देखें।
def cons(x, y):
return lambda pair: pair(x, y)
def car(pair):
return pair(lambda p, q: p)
def cdr(pair):
return pair(lambda p, q: q)
अब, car(cons("a", "b"))
आप 'a'
देना चाहिए: अजगर में, यह करने के लिए अनुवाद किया है।
वह कैसा है? उपसर्ग योजना :)
जाहिर है, आप cdr
रिकर्सन का उपयोग करके बिल्डिंग सूची शुरू कर सकते हैं। आप पाइथन में खाली जोड़ी होने के लिए nil
को परिभाषित कर सकते हैं।
def nil(): return()
ध्यान दें कि आप अजगर में =
का उपयोग कर चर आबद्ध करना होगा। क्या मैं सही हू? चूंकि यह चर को बदल सकता है, इसलिए मैं निरंतर कार्य को परिभाषित करता हूं।
बेशक, यह पाइथोनिक नहीं है लेकिन लिस्पी, इतना व्यावहारिक अभी तक सुरुचिपूर्ण नहीं है।
व्यायाम: पायथन में योजना पुस्तकालय http://srfi.schemers.org/srfi-1/srfi-1.html की सूची लागू करें। बस मजाक कर रहे हैं :)
लिस्पॉन की सूचियों का अनुकरण करने के लिए पाइथन की सूचियों और लूप का उपयोग करना ओवरकिल जैसा लगता है। इसके अलावा, जैसा कि @ एल्बर्ज ने इंगित किया है, यह उत्तर लिंक-सूचियों के बजाय सरणी-सूचियों को नियोजित करता है। मुझे उम्मीद है [यह निबंध] (http://www.jotflow.com/jot/PythonS-Cons-Car--Cdr/18) एक बेहतर समाधान देता है। –