निम्नलिखित को धयान मे रखते हुए:
items = []
items.append("apple")
items.append("orange")
items.append("banana")
# FAKE METHOD:
items.amount() # Should return 3
मैं सूची में तत्वों की संख्या कैसे प्राप्त करूं items
?
निम्नलिखित को धयान मे रखते हुए:
items = []
items.append("apple")
items.append("orange")
items.append("banana")
# FAKE METHOD:
items.amount() # Should return 3
मैं सूची में तत्वों की संख्या कैसे प्राप्त करूं items
?
जवाबों:
सूची का आकार कैसे प्राप्त करें?
सूची का आकार खोजने के लिए, बिल्टिन फ़ंक्शन का उपयोग करें len
:
items = []
items.append("apple")
items.append("orange")
items.append("banana")
और अब:
len(items)
रिटर्न ३।
पायथन में सब कुछ एक वस्तु है, जिसमें सूचियां भी शामिल हैं। सभी वस्तुओं के सी कार्यान्वयन में किसी प्रकार का हेडर है।
पायथन में "आकार" के साथ सूचियों और अन्य समान निर्मित वस्तुओं, विशेष रूप से, एक विशेषता कहा जाता है ob_size
, जहां ऑब्जेक्ट में तत्वों की संख्या कैश की जाती है। इसलिए किसी सूची में वस्तुओं की संख्या की जाँच करना बहुत तेज़ है।
लेकिन अगर आप जाँच कर रहे हैं कि सूची का आकार शून्य है या नहीं, तो उपयोग न करें len
- इसके बजाय, सूची को एक बूलियन संदर्भ में रखें - यह रिक्त के रूप में माना जाता है यदि रिक्त, सत्य अन्यथा ।
len(s)
किसी वस्तु की लंबाई (वस्तुओं की संख्या) लौटाएँ। तर्क एक अनुक्रम हो सकता है (जैसे कि एक स्ट्रिंग, बाइट्स, टपल, सूची, या रेंज) या एक संग्रह (जैसे एक शब्दकोश, सेट, या जमे हुए सेट)।
len
__len__
डेटा मॉडल डॉक्स से लागू किया गया है :
object.__len__(self)
अंतर्निहित फ़ंक्शन को लागू करने के लिए कहा जाता है
len()
। वस्तु की लंबाई वापस आनी चाहिए, एक पूर्णांक> = 0. इसके अलावा, एक वस्तु जो__nonzero__()
[2 पायथन में या__bool__()
पायथन 3 में] को परिभाषित नहीं करती है, और जिसकी__len__()
विधि शून्य मानती है, बूलियन संदर्भ में गलत माना जाता है।
और हम यह भी देख सकते हैं कि __len__
सूचियों की एक विधि है:
items.__len__()
रिटर्न ३।
len
(लंबाई) प्राप्त कर सकते हैंऔर वास्तव में हम देखते हैं कि हम सभी प्रकारों के लिए यह जानकारी प्राप्त कर सकते हैं:
>>> all(hasattr(cls, '__len__') for cls in (str, bytes, tuple, list,
xrange, dict, set, frozenset))
True
len
खाली या गैर-रिक्त सूची के लिए परीक्षण करने के लिए उपयोग न करेंएक विशिष्ट लंबाई के लिए परीक्षण करने के लिए, बस समानता के लिए परीक्षण करें:
if len(items) == required_length:
...
लेकिन शून्य लंबाई सूची या व्युत्क्रम के परीक्षण के लिए एक विशेष मामला है। उस मामले में, समानता के लिए परीक्षण न करें।
इसके अलावा, ऐसा न करें:
if len(items):
...
इसके बजाय, बस करो:
if items: # Then we have some items, not empty!
...
या
if not items: # Then we have an empty list!
...
मैं समझाता हूं कि यहां क्यों लेकिन संक्षेप में, if items
या if not items
अधिक पठनीय और अधिक प्रदर्शन करने वाला दोनों है।
हालांकि यह इस तथ्य के कारण उपयोगी नहीं हो सकता है कि यह "बॉक्स से बाहर" कार्यक्षमता के रूप में बहुत अधिक समझ में आता है, एक length
संपत्ति के साथ एक वर्ग बनाने के लिए एक काफी सरल हैक होगा :
class slist(list):
@property
def length(self):
return len(self)
आप इसे इस तरह से उपयोग कर सकते हैं:
>>> l = slist(range(10))
>>> l.length
10
>>> print l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
अनिवार्य रूप से, यह एक ओओपी-अनुकूल length
संपत्ति होने के अतिरिक्त लाभ के साथ, एक सूची वस्तु के समान है ।
हमेशा की तरह, आपके माईलेज़ भिन्न हो सकते हैं।
length = property(len)
और एक पंक्ति आवरण फ़ंक्शन को छोड़ सकते हैं और len
अपनी संपत्ति के साथ प्रलेखन / आत्मनिरीक्षण रख सकते हैं।
इसके अलावा len
आप भी उपयोग कर सकते हैं operator.length_hint
(पाइथन 3.4+ की आवश्यकता है)। एक सामान्य के लिए list
दोनों समान हैं, लेकिन length_hint
एक सूची-पुनरावृत्त की लंबाई प्राप्त करना संभव बनाता है, जो कुछ परिस्थितियों में उपयोगी हो सकता है:
>>> from operator import length_hint
>>> l = ["apple", "orange", "banana"]
>>> len(l)
3
>>> length_hint(l)
3
>>> list_iterator = iter(l)
>>> len(list_iterator)
TypeError: object of type 'list_iterator' has no len()
>>> length_hint(list_iterator)
3
लेकिन length_hint
परिभाषा के अनुसार केवल एक "संकेत" है, इसलिए अधिकांश समय len
बेहतर है।
मैंने कई उत्तरों को एक्सेस करने का सुझाव दिया है __len__
। बिल्ट-इन कक्षाओं जैसे काम करते समय यह सब ठीक है list
, लेकिन यह कस्टम कक्षाओं के साथ समस्याओं का कारण बन सकता है, क्योंकि len
(और length_hint
) कुछ सुरक्षा जांचों को लागू करते हैं। उदाहरण के लिए, दोनों नकारात्मक लंबाई या लंबाई की अनुमति नहीं देते हैं जो एक निश्चित मूल्य ( sys.maxsize
मूल्य) से अधिक है। इसलिए यह विधि के len
बजाय फ़ंक्शन का उपयोग करने के लिए हमेशा सुरक्षित है __len__
!
पहले दिए गए उदाहरणों के रूप में अपने प्रश्न का उत्तर देना:
items = []
items.append("apple")
items.append("orange")
items.append("banana")
print items.__len__()
__foo__
.: यह सिर्फ एक कन्वेंशन है, पायथन सिस्टम के लिए उन नामों का उपयोग करने का जो उपयोगकर्ता नामों के साथ संघर्ष नहीं करेंगे। 2 _foo
.: यह सिर्फ एक कन्वेंशन है, प्रोग्रामर के लिए यह दर्शाने का एक तरीका है कि वैरिएबल निजी है (पाइथन में जो भी मतलब है)। 3. __foo
- इसका वास्तविक अर्थ है: दुभाषिया इस नाम के साथ यह _classname__foo
सुनिश्चित करने के तरीके की जगह लेता है कि यह नाम किसी अन्य वर्ग में समान नाम के साथ ओवरलैप नहीं होगा। * अंडरस्कोर के किसी अन्य रूप का अर्थ पायथन दुनिया में नहीं है। * इन सम्मेलनों में वर्ग, चर, वैश्विक आदि के बीच कोई अंतर नहीं है।
और पूर्णता (मुख्य रूप से शैक्षिक) के लिए, यह len()
फ़ंक्शन का उपयोग किए बिना संभव है। मैं इसे एक अच्छे विकल्प के रूप में स्वीकार नहीं करूंगा , यह पायथन में इस तरह की पसंद नहीं है , लेकिन यह एल्गोरिदम सीखने के लिए एक उद्देश्य प्रदान करता है।
def count(list):
item_count = 0
for item in list[:]:
item_count += 1
return item_count
count([1,2,3,4,5])
(में बृहदान्त्र list[:]
अंतर्निहित है और इसलिए वैकल्पिक भी है।)
नए प्रोग्रामर के लिए यहां सबक यह है: आप किसी सूची में आइटम की संख्या को किसी बिंदु पर गिने बिना नहीं प्राप्त कर सकते हैं। सवाल बन जाता है: उन्हें गिनने का अच्छा समय कब है? उदाहरण के लिए, उच्च-प्रदर्शन कोड जैसे कनेक्ट सिस्टम कॉल सॉकेट्स के लिए (सी में लिखा गया है) connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
, तत्वों की लंबाई (कॉलिंग कोड को जिम्मेदारी देते हुए) की गणना नहीं करता है। ध्यान दें कि पहले लंबाई की गिनती के चरण को बचाने के लिए पते की लंबाई को पारित किया जाता है? एक अन्य विकल्प: कम्प्यूटेशनल रूप से, यह आपके द्वारा पास की जाने वाली वस्तु के भीतर जोड़ते समय वस्तुओं की संख्या पर नज़र रखने के लिए समझ में आता है। मन कि यह स्मृति में अधिक जगह लेता है। देखिए नफ़तुली के का जवाब ।
स्मृति में अधिक स्थान लेते हुए प्रदर्शन में सुधार करने के लिए लंबाई पर नज़र रखने का उदाहरण। ध्यान दें कि मैं कभी भी लेन () फ़ंक्शन का उपयोग नहीं करता क्योंकि लंबाई ट्रैक की जाती है:
class MyList(object):
def __init__(self):
self._data = []
self.length = 0 # length tracker that takes up memory but makes length op O(1) time
# the implicit iterator in a list class
def __iter__(self):
for elem in self._data:
yield elem
def add(self, elem):
self._data.append(elem)
self.length += 1
def remove(self, elem):
self._data.remove(elem)
self.length -= 1
mylist = MyList()
mylist.add(1)
mylist.add(2)
mylist.add(3)
print(mylist.length) # 3
mylist.remove(3)
print(mylist.length) # 2
for item in list[:]:
? क्यों नहीं for item in list:
? इसके अलावा, मैं += 1
वेतन वृद्धि का उपयोग करूंगा ।
len()
वास्तव में कैसे काम करता है के संदर्भ में , यह इसका सी कार्यान्वयन है :
static PyObject *
builtin_len(PyObject *module, PyObject *obj)
/*[clinic end generated code: output=fa7a270d314dfb6c input=bc55598da9e9c9b5]*/
{
Py_ssize_t res;
res = PyObject_Size(obj);
if (res < 0) {
assert(PyErr_Occurred());
return NULL;
}
return PyLong_FromSsize_t(res);
}
Py_ssize_t
अधिकतम लंबाई है कि वस्तु हो सकती है। PyObject_Size()
एक ऐसा कार्य है जो किसी वस्तु का आकार देता है। यदि यह किसी वस्तु के आकार को निर्धारित नहीं कर सकता है, तो यह -1 देता है। उस स्थिति में, यह कोड ब्लॉक निष्पादित किया जाएगा:
if (res < 0) {
assert(PyErr_Occurred());
return NULL;
}
और एक परिणाम के रूप में एक अपवाद उठाया जाता है। अन्यथा, यह कोड ब्लॉक निष्पादित किया जाएगा:
return PyLong_FromSsize_t(res);
res
जो एक C
पूर्णांक है, एक अजगर में परिवर्तित हो जाता है long
और वापस आ जाता है। सभी अजगर पूर्णांक longs
3 पायथन के बाद से संग्रहीत हैं ।