2012-12-14 19 views
32

की लंबाई कैसे प्राप्त करें I Python itertools के साथ काम कर रहा हूं और अंतिम तत्व द्वारा जोड़े के समूह को सॉर्ट करने के लिए समूहबी का उपयोग कर रहा हूं। मुझे इसे सॉर्ट करने के लिए मिल गया है और मैं समूहों के माध्यम से बस ठीक कर सकता हूं, लेकिन मैं वास्तव में प्रत्येक समूह की लंबाई प्राप्त करने में सक्षम होना चाहता हूं, बिना किसी काउंटर को बढ़ाने के लिए।पायथन: itertools _grouper

प्रोजेक्ट कुछ डेटा पॉइंट क्लस्टर है। मैं के जोड़े के साथ काम कर रहा हूँ (numpy.array, पूर्णांक) जहां numpy सरणी एक डेटा बिंदु है और पूर्णांक एक क्लस्टर लेबल

यहाँ मेरी प्रासंगिक कोड है:

data = sorted(data, key=lambda (point, cluster):cluster) 
for cluster,clusterList in itertools.groupby(data, key=lambda (point, cluster):cluster): 
    if len(clusterList) < minLen: 

अंतिम पंक्ति, 'अगर लेन (क्लस्टरलिस्ट) < मिनीलेन:', मुझे एक त्रुटि मिलती है कि 'itertools._grouper' प्रकार का ऑब्जेक्ट कोई लेन() नहीं है।

मैंने _groupers के लिए उपलब्ध संचालन को देखा है, लेकिन किसी समूह की लंबाई प्रदान करने के लिए ऐसा कुछ भी नहीं मिल रहा है।

+0

बेहतर तरीके हो सकते हैं, लेकिन आप एक सूची में पुनरावर्तनीय रूपांतरित कर सकते हैं और तत्वों की गणना कर सकते हैं ('यदि लेन (सूची (क्लस्टरलिस्ट)) RocketDonkey

+0

धन्यवाद, रॉकेटडॉकी, जो पूरी तरह से काम करता है! – user1466679

+0

कोई समस्या नहीं - नीचे दिए गए उत्तरों एक ही फिक्स का सुझाव देते हैं, ताकि आप इसे 'उत्तर' बनाने के लिए उनमें से एक को स्वीकार कर सकें। सबकुछ के लिए सुभकामनाये! – RocketDonkey

उत्तर

38

सिर्फ इसलिए कि आप इसे clusterList कहते हैं, यह एक सूची नहीं बनाता है! यह मूल रूप से एक आलसी इटरेटर है, प्रत्येक आइटम को इसकी आवश्यकता के रूप में लौट रहा है। तुम्हें पता है, हालांकि इस तरह की एक सूची में परिवर्तित कर सकते हैं:

clusterList = list(clusterList) 

या कि क्या करना है और एक ही चरण में इसकी लंबाई मिलती है:

length = len(list(clusterList)) 

आप बनाने की स्मृति को लेने के लिए नहीं करना चाहते हैं यह एक सूची, तो आप इस के बजाय कर सकते हैं:

length = sum(1 for x in clusterList) 

ध्यान रखें कि मूल iterator या तो एक सूची में परिवर्तित करने या sum() तैयार करने का उपयोग करके पूरी तरह से भस्म हो जाएगा।

1

clusterListiterable है लेकिन यह list नहीं है। यह कभी-कभी थोड़ा उलझन में हो सकता है। आप clusterList पर लूप कर सकते हैं लेकिन आप इसके ऊपर अन्य सूची चीजें नहीं कर सकते हैं (स्लाइस, लेन, इत्यादि)।

फिक्स: list(clusterList) से clusterList का परिणाम असाइन करें।