2013-04-08 48 views
16

subscriptable नहीं है मैं त्रुटिलेखन त्रुटि: 'फिल्टर' वस्तु

TypeError: 'filter' object is not subscriptable 
प्राप्त कर रहा

जब कोड

bonds_unique = {} 
for bond in bonds_new: 
    if bond[0] < 0: 
     ghost_atom = -(bond[0]) - 1 
     bond_index = 0 
    elif bond[1] < 0: 
     ghost_atom = -(bond[1]) - 1 
     bond_index = 1 
    else: 
     bonds_unique[repr(bond)] = bond 
     continue 
    if sheet[ghost_atom][1] > r_length or sheet[ghost_atom][1] < 0: 
     ghost_x = sheet[ghost_atom][0] 
     ghost_y = sheet[ghost_atom][1] % r_length 
     image = filter(lambda i: abs(i[0] - ghost_x) < 1e-2 and 
         abs(i[1] - ghost_y) < 1e-2, sheet) 
     bond[bond_index] = old_to_new[sheet.index(image[0]) + 1 ] 
     bond.sort() 
     #print >> stderr, ghost_atom +1, bond[bond_index], image 
    bonds_unique[repr(bond)] = bond 

# Removing duplicate bonds 
bonds_unique = sorted(bonds_unique.values()) 

और

sheet_new = [] 
bonds_new = [] 
old_to_new = {} 
sheet=[] 
bonds=[] 

त्रुटि के निम्नलिखित ब्लॉक चलाने का प्रयास लाइन

पर होता है

मैं क्षमा चाहता हूं कि इस प्रकार का प्रश्न कई बार पोस्ट किया गया है, लेकिन मैं पाइथन के लिए काफी नया हूं और शब्दकोशों को पूरी तरह समझ नहीं पा रहा हूं। क्या मैं एक ऐसे शब्दकोश का उपयोग करने की कोशिश कर रहा हूं जिसमें इसका उपयोग नहीं किया जाना चाहिए, या क्या मुझे एक शब्दकोश का उपयोग करना चाहिए जहां मैं इसका उपयोग नहीं कर रहा हूं? मुझे पता है कि फिक्स शायद बहुत आसान है (यद्यपि मेरे लिए नहीं), और अगर कोई मुझे सही दिशा में इंगित कर सकता है तो मैं बहुत आभारी रहूंगा।

बार फिर, मैं माफी माँगता हूँ अगर इस सवाल पहले से ही उत्तर दिया गया है

धन्यवाद,

क्रिस।

मैं विंडोज 7 64-बिट पर पायथन आईडीई 3.3.1 का उपयोग कर रहा हूं।

उत्तर

25

filter() पायथन 3 में एक सूची लौटाता है, लेकिन एक पुनरावृत्त filter ऑब्जेक्ट। पहले फ़िल्टर किए गए आइटम प्राप्त करने के लिए उस पर next() कॉल करें:

bond[bond_index] = old_to_new[sheet.index(next(image)) + 1 ] 

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

+9

इसलिए जब इस भाषा OO है और जब यह प्रक्रियात्मक है याद करने के लिए निराशा होती - क्यों नहीं 'iterable.next()' 'बजाय अगले की (iterable) '? – Basic

+4

@ बासिक: '.next()' हुक विधि है, 'अगला() 'stdlib एपीआई। 'लेन()' बनाम '.__ लेन __()', 'str()' बनाम '.__ str __()', आदि की तरह। पायथन 3 में '.next() 'विधि का नाम बदलकर' .__ अगला __() '; यह एक गलती थी कि इसे एक विशेष विधि का नाम न दें। 'अगला() '(फ़ंक्शन) आपको' स्टॉपइटरेशन 'उठाए जाने पर वापस करने के लिए डिफ़ॉल्ट मान निर्दिष्ट करने देता है। –

2
image = list(filter(lambda i: abs(i[0] - ghost_x) < 1e-2 and abs(i[1] - ghost_y) < 1e-2, sheet)) 
0

उपयोग listfilter से पहले condtion तो यह ठीक काम करता है। मेरे लिए इस मुद्दे को हल किया।

उदाहरण के लिए

list(filter(lambda x: x%2!=0, mylist)) 
बजाय

filter(lambda x: x%2!=0, mylist) 
संबंधित मुद्दे