2011-11-10 16 views
8

क्या Python में cons के बराबर है? (2.5 से ऊपर कोई संस्करण)पाइथन में LISP विपक्ष

यदि हां, तो क्या यह बनाया गया है? या मुझे easy_install एक मॉड्यूल प्राप्त करने की आवश्यकता है?

उत्तर

7

पायथन में, लिस्प-स्टाइल लिंक्ड सूचियों की तुलना में सरणी-आधारित 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] 
+1

लिस्पॉन की सूचियों का अनुकरण करने के लिए पाइथन की सूचियों और लूप का उपयोग करना ओवरकिल जैसा लगता है। इसके अलावा, जैसा कि @ एल्बर्ज ने इंगित किया है, यह उत्तर लिंक-सूचियों के बजाय सरणी-सूचियों को नियोजित करता है। मुझे उम्मीद है [यह निबंध] (http://www.jotflow.com/jot/PythonS-Cons-Car--Cdr/18) एक बेहतर समाधान देता है। –

1

सं। cons लिस्प जैसी भाषाओं का कार्यान्वयन विवरण है; यह पायथन में किसी भी सार्थक अर्थ में मौजूद नहीं है।

+0

इसलिए '[1, 2, [3, 4, 5, [4, 1]]] से '[1, 2, 3, 4' जैसे" condense "सूचियों का कोई तरीका नहीं है, 5, 4, 1] '? – tekknolagi

+1

वहाँ है, लेकिन 'विपक्ष' यह नहीं है। देखें: http://stackoverflow.com/questions/406121/flattening-a-shallow-list-in-python – duskwuff

2

आप काफी तुच्छता से एक वर्ग है कि बर्ताव बहुत cons तरह परिभाषित कर सकते हैं:

class Cons(object): 
    def __init__(self, car, cdr): 
     self.car = car 
     self.cdr = cdr 

हालांकि यह एक बहुत ही 'दिग्गज' जिस तरह से बुनियादी डेटा संरचनाओं, जो अजगर के लिए अनुकूल नहीं है निर्माण करने के लिए है, इसलिए मैं करूंगा उम्मीद है कि परिणाम लिस्प में समान कुछ करने से अधिक CPU/स्मृति गहन हो।

3

ध्यान दें कि पायथन की सूचियां वैक्टर के रूप में लागू की जाती हैं, न कि लिंक्ड सूचियों के रूप में। आप lst.insert(0, val) कर सकते हैं, लेकिन वह ऑपरेशन ओ (एन) है।

यदि आप एक डेटा संरचना चाहते हैं जो एक लिंक की गई सूची की तरह व्यवहार करे, तो Deque का उपयोग करने का प्रयास करें।

5

चेतावनी: नीचे दी गई सामग्री व्यावहारिक नहीं हो सकती है!

असल में, 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 की सूची लागू करें। बस मजाक कर रहे हैं :)