एक सूची में दीर्घवृत्त […] का क्या अर्थ है?


196

मैं अजगर में इधर-उधर खेल रहा था। मैंने निम्नलिखित कोड का उपयोग IDLE में किया:

p  = [1, 2]
p[1:1] = [p]
print p

आउटपुट था:

[1, [...], 2]

यह क्या है […]? दिलचस्प बात यह है कि अब मैं इसे अनंत की सूची की सूची के रूप में उपयोग कर सकता हूं

p[1][1][1]....

जब तक मैं चाहता था मैं ऊपर लिख सकता हूं और यह अभी भी काम करेगा।

संपादित करें:

  • इसे स्मृति में कैसे दर्शाया गया है?
  • इसका क्या उपयोग है? कुछ मामलों के उदाहरण जहां यह उपयोगी है, उपयोगी होगा।
  • आधिकारिक प्रलेखन के लिए कोई भी लिंक वास्तव में उपयोगी होगा।

अभी भी EDIT के 1st और 3rd लिस्ट एलिमेंट के जवाब की तलाश है।
असीम बंसल

7
एक सरल उदाहरण होगा p = [1]; p[0] = p
अर्शजी

6
मुझे लगता है कि यह पायथन में मतलब की सूची में […] (एक दीर्घवृत्त) का एक डुप्लिकेट है ? , हालांकि इस प्रश्न में प्रश्न (और उत्तर) बेहतर हैं।
मार्टिन थोमा

1
ड्रीमपाइ स्मार्ट है >> >>> p [1: 1] = [p] >>> p 3: [1, <id के साथ सूची में पुनरावृत्ति = 3074777548>, 2] >>> `सटीक विवरण प्रदान करते हैं
राहुल गौतम

@RahulGautam को यह नहीं मिला p 3: [1, <Recursion on list with id=3074777548>, 2]। क्या चला?
असीम बंसल

जवाबों:


112

इसका मतलब है कि आपने अपने भीतर एक अनंत सूची बनाई है, जिसे मुद्रित नहीं किया जा सकता है। pशामिल pहै जो होता है p... और इतने पर। [...]अंकन तुम यह जानते हो, और सूचित करना है कि यह नहीं दर्शाया जा सकता जाने के लिए एक तरीका है! एक अच्छी तस्वीर देखने के लिए @ 6502 के उत्तर पर एक नज़र डालें कि क्या हो रहा है।

अब, आपके संपादन के बाद तीन नई वस्तुओं के बारे में:

  • यह उत्तर इसे कवर करता है
  • इग्नासियो का लिंक कुछ संभावित उपयोगों का वर्णन करता है
  • यह प्रोग्रामिंग भाषाओं की तुलना में डेटा संरचना डिजाइन का एक विषय है, इसलिए यह संभावना नहीं है कि पायथन के आधिकारिक दस्तावेज में कोई संदर्भ पाया गया है

तो क्या यह शिशु स्मृति ले रहा है? मुझे पता है कि यह संभव नहीं हो सकता। इसका प्रतिनिधित्व कैसे किया जाता है और इसका क्या उपयोग है?
असेम बंसल

21
@Zel: सूची तत्व संदर्भ हैं। दूसरा तत्व सूची का एक संदर्भ है।
इग्नासियो वाज़केज़-अब्राम्स

2
अजगर ने इसे संदर्भों के अनंत पाश के रूप में पहचाना, इसलिए इसने इसे छोटा करने का फैसला किया, यह वास्तव में अनंत नहीं है। और नहीं, यह वास्तव में एक सोचा प्रयोग के अलावा उपयोगी नहीं है :)
óscar López

2
वहाँ हैं ... असीम पुनरावर्ती संरचनाओं के लिए कुछ उपयोग। लेकिन ज्यादा नहीं।
इग्नासियो वाज़क्वेज़-अब्राम्स

@ इग्नासियोविजेक-अब्राम कुछ उदाहरण उपयोगी होंगे।
असीम बंसल

316

यह आपका कोड बनाया गया है

यहां छवि विवरण दर्ज करें

यह एक सूची है जहां पहले और अंतिम तत्व दो संख्याओं (1 और 2) की ओर इशारा करते हैं और जहां मध्य तत्व सूची की ओर इशारा कर रहा है।

कॉमन लिस्प में जब सर्कुलर स्ट्रक्चर्स को इनेबल किया जाता है तो ऐसी ऑब्जेक्ट को प्रिंट किया जाएगा

#1=#(1 #1# 2)

इसका मतलब है कि एक वस्तु है (1 के साथ लेबल #1=) जो तीन तत्वों के साथ एक सदिश है, दूसरा वस्तु ही है (पीछे संदर्भित #1#)।

पाइथन के बजाय आपको केवल यह जानकारी मिलती है कि संरचना किसके साथ परिपत्र है [...]

इस विशिष्ट मामले में विवरण अस्पष्ट नहीं है (यह एक सूची की ओर इशारा करता है, लेकिन केवल एक सूची है, इसलिए इसे एक होना चाहिए)। हालांकि अन्य मामलों में अस्पष्ट हो सकता है ... उदाहरण के लिए

[1, [2, [...], 3]]

पिछड़े संदर्भ या तो बाहरी या आंतरिक सूची को इंगित कर सकते हैं। एक ही तरह से मुद्रित इन दो अलग-अलग संरचनाओं के साथ बनाया जा सकता है

x = [1, [2, 3]]
x[1][1:1] = [x[1]]

y = [1, [2, 3]]
y[1][1:1] = [y]

print(x)
print(y)

और वे स्मृति में होंगे

यहां छवि विवरण दर्ज करें


आप [1, [2, [...], 3]]इस तरह की सामग्री पा सकते हैं : x[1] = [2, [...], 3]और y[1] = [2, 1, [...]], 3]। इसका मतलब यह है कि x में 1 है और फिर 2s को दोहरा रहा है, जबकि y में 1s और 2s को वैकल्पिक करना शामिल है।
पास्कलीन

2
@ अक्षर: बेशक आप सामग्री का विश्लेषण करके दोनों को अलग कर सकते हैं, हालांकि वे एक ही प्रतिनिधित्व के साथ मुद्रित होते हैं। कॉमन लिस्प स्वरूप में इसके बजाय वे किया जाएगा #(1 #1=#(2 #1# 3))के लिए xऔर #1=#(1 #(2 #1# 3))के लिए y
6502

5
@BurhanKhalid: पहले और दूसरे के लिए जिम्प के लिए इंकस्केप (क्योंकि मैं दूर svg फेंक दिया)
6502

1
@csharpler: आप पायथन में एक "अनंत सूची" नहीं बना सकते क्योंकि सूचियाँ वास्तव में परिवर्तनशील सरणियाँ हैं, न कि लिंक की गई सूचियाँ। इसके बजाय कॉमन लिस्प में एक "अनंत सूची" बनाई जा सकती है #1=(1 . #1#)
6502

1
+ अगर आप इस कोशिश की तरह acsii- चित्र बनाना चाहते हैं: Asiiflow
Grijesh Chauhan

23

"इसके उपयोग क्या है" सवाल के लिए, यहां एक ठोस उदाहरण है।

ग्राफ़ की कमी एक मूल्यांकन रणनीति है जिसका उपयोग कंप्यूटर भाषा की व्याख्या करने के लिए कुछ समय के लिए किया जाता है। यह आलसी मूल्यांकन के लिए एक आम रणनीति है, विशेष रूप से कार्यात्मक भाषाओं की।

प्रारंभिक बिंदु "कदम" के अनुक्रम का प्रतिनिधित्व करने वाले एक ग्राफ का निर्माण करना है जो कार्यक्रम ले जाएगा। उस कार्यक्रम में उपयोग किए जाने वाले नियंत्रण संरचनाओं के आधार पर, यह हो सकता है चक्रीय ग्राफ (क्योंकि कार्यक्रम में "हमेशा के लिए" लूप का कुछ प्रकार होता है - या पुनरावर्तन का उपयोग करें जिसका "गहराई" मूल्यांकन समय पर जाना जाएगा , लेकिन ग्राफ में नहीं- निर्माण समय) ...

इस तरह के ग्राफ का प्रतिनिधित्व करने के लिए, आपको आवश्यकता है अनंत "डेटा संरचनाओं" (कभी-कभी पुनरावर्ती डेटा संरचनाओं कहा जाता है ) की आवश्यकता होती है, जैसे आपने देखा। आमतौर पर, हालांकि थोड़ा और अधिक जटिल है।

यदि आप उस विषय में रुचि रखते हैं, तो यहां (कई अन्य लोगों के बीच) उस विषय पर एक व्याख्यान है: http :
//under स्नातक.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf


7

हम यह हर समय ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में करते हैं। यदि कोई भी दो वस्तुएं प्रत्यक्ष या परोक्ष रूप से एक-दूसरे को संदर्भित करती हैं, तो वे दोनों असीम रूप से पुनरावर्ती संरचनाएं हैं (या आप इसे कैसे देखते हैं, इसके आधार पर एक ही असीम रूप से पुनरावर्ती संरचना के दोनों भाग)। इसीलिए आप सूची के रूप में कुछ इस तरह से आदिम नहीं देखते - क्योंकि हम आमतौर पर अवधारणा को "अनंत सूची" की तुलना में परस्पर "वस्तुओं" के रूप में वर्णित करना बेहतर समझते हैं।

आप ...एक असीम पुनरावर्ती शब्दकोश के साथ भी प्राप्त कर सकते हैं । मान लें कि आप एक त्रिभुज के कोनों का शब्दकोश चाहते हैं, जहाँ प्रत्येक मान उस कोने से जुड़े अन्य कोनों का शब्दकोश हो। आप इसे इस तरह सेट कर सकते हैं:

a = {}
b = {}
c = {}
triangle = {"a": a, "b": b, "c": c}
a["b"] = b
a["c"] = c
b["a"] = a
b["c"] = c
c["a"] = a
c["b"] = b

अब अगर आप प्रिंट triangle(या aया bया cउस बात के लिए), आप इसे से भरा हुआ है देखेंगे {...}क्योंकि किसी भी दो कोनों एक दूसरे के लिए वापस करने के लिए बात कर रहे हैं।


सरल शब्दकोश उदाहरण:a = {}; a['a'] = a; print a['a']['a']['a']
user650654

मेरे लिए, "..." के बजाय यह दिखाता है "<= आईडी के साथ
तानाशाही पर पुनरावृत्ति

@SolomonUcko आप शायद IPython जो स्वचालित रूप से उपयोग करता है का उपयोग कर रहे pprint बातें मुद्रित करने के लिए। यदि आप %pprintसुंदर-छपाई बंद करना चाहते हैं, तो यह दिखाई देगा ...
nmclean

4

जैसा कि मैंने समझा, यह निश्चित बिंदु का एक उदाहरण है

p  = [1, 2]
p[1:1] = [p]
f = lambda x:x[1]
f(p)==p
f(f(p))==p

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

@Zel: ठीक है, आपको इससे पहले ओपी कोड जोड़ना होगा ताकि पी घोषित हो।
इनकैन

1
@Zel: ठीक है, मुझे यकीन नहीं है कि यह खुद कितना मददगार है, लेकिन फायरगन का कहना है कि p (और इसलिए p [1], [...] के रूप में दर्शाया गया है जो फ़ंक्शन का एक बिंदु है। IMHO, यह सवाल का एक संभावित उत्तर है "क्या है [...]?" इस मामले में।
इनकैन

1
मेरे पास एक ही त्रुटि मुद्दा था क्योंकि मैंने सरल p = [1]; p[0] = pउदाहरण की कोशिश करने के बाद इस उदाहरण की कोशिश की थी जिसे f = lambda x:x[0]काम करने की आवश्यकता है। यह एक फिक्स पॉइंट का एक उदाहरण है, लेकिन मैं अभी तक यह नहीं देख पाया कि यह जानना कितना उपयोगी है। फ़िक्स पॉइंट का वास्तविक मान किसी अन्य बिंदु से पुनरावर्ती या पुनरावृत्त तरीके से उस पर आ रहा है। एक उदाहरण जो दिखाता है कि वाई कॉम्बिनेटर बनाने के लिए मूल प्रश्न की सूची संरचना का उपयोग कैसे करें यदि यह संभव है तो सहायक होगा।
डान्सलमो


-2

उस विशेष वस्तु का नाम एलिप्सिस है। मुझे लगता है कि यह पायथन इंटेप्टर / वीएम में एक सिंगलटन ऑब्जेक्ट के रूप में लागू किया गया है - कुछ भी नहीं जैसे --- प्रहरी का एक प्रकार। जैसा कि आपने देखा कि यह पायथन के लिए अपने भीतर एक सूची के संदर्भ का प्रतिनिधित्व करने का एक तरीका है।


विचित्र रूप से लगता है कि एलिप्सीस वस्तु को सीधे करने का कोई तरीका नहीं है। उदाहरण के लिए अंतर्निहित इंटरफ़ेस के माध्यम से नाम उजागर नहीं किया गया है। इसलिए, यदि आप एक सूचकांक के रूप में एक दीर्घवृत्त का उपयोग करके किसी आइटम को निकालने का प्रयास करते हैं, तो आप उदाहरण के लिए कुछ त्रुटियों (उठाए गए अपवादों) में शब्द के संदर्भ देख सकते हैं। लेकिन आप बस कह सकते हैं: एल = एलिप्सिस () और न ही ऐसा कुछ (जैसा मैंने पाया है)।
जिम डेनिस

9
इसका वास्तव में एलिप्सिस वस्तु से कोई लेना-देना नहीं है। यह सिर्फ शाब्दिक स्ट्रिंग "[...]" है, जो एक सूची को प्रिंट करने के दौरान एक चक्र का पता चलने पर मुद्रित होता है। कोड देखें: hg.python.org/cpython/file/84d6c1c0665e/Objects/…
जेरेमी शार्प
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.