2012-10-26 17 views
6

मेरे पास गैर-शून्य मूल्यों को संग्रहीत करने के लिए पायथन A[row,col,value] में समन्वयित संग्रहण सूची है।आंतरिक सूची में पहले आइटम कुशलता से यथासंभव

मैं सभी पंक्ति अनुक्रमणिका की सूची कैसे प्राप्त कर सकता हूं? मुझे उम्मीद है कि A[0:][0]print A[0:] के रूप में काम करने के लिए पूरी सूची प्रिंट करता है लेकिन print A[0:][0] केवल A[0] प्रिंट करता है।

कारण मैं पूछ प्रत्येक पंक्ति यानीrange(0,n) से अधिक पुनरावृत्ति जहां n पंक्तियों की कुल संख्या है में गैर शून्य मानों की संख्या की गणना के लिए कुशल है। for i in range(0,n): for j in A: ... के वर्तमान तरीके से यह सस्ता होना चाहिए।

कुछ की तरह:

c = [] 
# for the total number of rows 
for i in range(0,n): 
    # get number of rows with only one entry in coordinate storage list 
    if A[0:][0].count(i) == 1: c.append(i)     
return c 

से अधिक:

c = [] 
# for the total number of rows 
for i in range(0,n): 
    # get the index and initialize the count to 0 
    c.append([i,0]) 
    # for every entry in coordinate storage list 
    for j in A: 
     # if row index (A[:][0]) is equal to current row i, increment count 
     if j[0] == i: 
      c[i][1]+=1 
return c 

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

Junuxx का जवाब, this question और this post का उपयोग करते हुए मैं (निम्नलिखित के साथ आया संख्या लौटने के लिए सिंगलटन पंक्तियों का) जो कि बहुत तेज़ है मेरे मूल प्रयास से मेरी वर्तमान समस्या A का आकार। हालांकि यह अभी भी पंक्तियों और स्तंभों की संख्या के साथ बढ़ता है। मुझे आश्चर्य है कि A पर फिर से शुरू करना संभव नहीं है, लेकिन बस n तक?

# get total list of row indexes from coordinate storage list 
row_indexes = [i[0] for i in A] 
# create dictionary {index:count} 
c = Counter(row_indexes)  
# return only value where count == 1 
return [c[0] for c in c.items() if c[1] == 1] 
+1

@larsman: मुझे लगता है एक ट्रिपल की एक सूची है। – Junuxx

+0

हां, आपको मिल गया। –

+1

क्या आप एक सरल, अक्षम, कामकाजी उदाहरण लिख सकते हैं जो आप करने की कोशिश कर रहे हैं? मुझे वास्तव में उलझन में सवाल का शब्द मिल रहा है, और आपका कोई उदाहरण कोड-ब्लॉक एक ही काम नहीं कर रहा है ..? – dbr

उत्तर

10

यह करना चाहिए:

c = [x[0] for x in A] 

यह एक सूची समझ है कि पहले (उप) A के प्रत्येक तत्व के तत्व लेता है।

+0

यह मेरे मूल समाधान से काफी बेहतर प्रदर्शन करता है। कृपया मेरा संपादन देखें, क्या यह संभव है कि ए पर फिर से न हो? बहुत सराहना की! –

+0

यदि ए बहुत बड़ा है लेकिन ए के तत्वों में केवल तीन सदस्य हैं, तो यह तीन सूचियों, 'पंक्तियों', 'कॉलम' और 'मानों' को स्टोर करने के लिए अधिक कुशल हो सकता है। आप तुरंत सभी पंक्ति संख्याएं प्राप्त कर पाएंगे, और फिर भी सभी तीन सूचियों (वे गठबंधन किए गए हैं) के लिए एक ही इंडेक्स का उपयोग कर एक एकल प्रविष्टि तक पहुंच सकते हैं। यदि ए और उपन्यास दोनों लंबे हैं, तो यह सही हो सकता है कि एक सही twodimensional डेटा संरचना का उपयोग करना बेहतर हो जैसे कि numpy द्वारा प्रदान किया गया (नेस्टेड सूचियों के बजाय जॉन क्लेमेंट्स का जवाब देखें)। – Junuxx

4

दक्षता और बढ़ाया स्लाइस के लिए, आप numpy उपयोग कर सकते हैं - जो अपने उदाहरण दिए गए एक अच्छा विचार की तरह लगता है:

import numpy as np 
yourlist = [ 
    [0, 0, 0], 
    [0, 1, 1], 
    [1, 0, 2] 
] 
a = np.array(yourlist) 
print a[:,0] 
# [0 0 1] 
bc = np.bincount(a[:,0]) 
# array([2, 1]) 
count = bc[bc==1].size 
# 1 
# or... (I think it's probably better...) 
count = np.count_nonzero(bc == 1) 
+0

मुझे काम करने के लिए आपका उदाहरण नहीं मिल रहा है .. 'टाइप करें (मेरी सूची [0] [0])' रिटर्न 'int',' टाइप (ए [0] [0]) '' _pypy.float64' 'के बाद 'a = numpy.array (mylist) 'जब मैं 'bincount (a [:, 0]) कोशिश करता हूं,' मुझे' TypeError मिलता है: सरणी को सुरक्षित प्रकार से सुरक्षित रूप से नहीं डाला जा सकता है 'मैंने कोशिश की 'bc = numpy.bincount (numpy.arange (a [:, 0], dtype = numpy।int)) 'और त्रुटि' टाइपरर है: केवल लंबाई -1 एरे को पाइथन स्केलर्स में परिवर्तित किया जा सकता है –

+0

@sudo_o सुनिश्चित नहीं है कि इसके बारे में क्या कहना है - 'np.array' (' np.arange') के बाद मैं अंत 'प्रकार के साथ (एक [0] [0])' और बाकी सब कुछ काम करता है ... –