मैं एक टपल की तरह फ़िल्टर कर रहा हूँ;

 newtuple = filter(lambda x: x[2].startswith('902'), csvlist)

फिर उसे मेरी मूल csvlist से निकालने का प्रयास करें

csvlist.remove(newtuple) //<--Gives error

लेकिन मिल रहा है;

ValueError: list.remove(x): x not in list

मैं यहाँ क्या गलत कर रहा हूँ?

-1
Ratha 30 अगस्त 2018, 04:15

1 उत्तर

सबसे बढ़िया उत्तर

मेरी पुष्टि की गई टिप्पणी को अपनाना: filter सभी मैचों को एक क्रम के रूप में लौटाता है, न कि केवल पहला मैच, इसलिए "newtuple" यहां एक मिथ्या नाम है, यह वास्तव में "newtuples< है /code>" बहुवचन (Py2 पर tuples की सूची, Py3 पर tuples का जनरेटर)।

सबसे सरल उपाय यह है कि आप अपना कोड इसमें बदलें:

newtuples = filter(lambda x: x[2].startswith('902'), csvlist)
for newtuple in newtuples:  # in list(newtuples) on Py3 to avoid mutating csvlist while iterating
    csvlist.remove(newtuple)

लेकिन इसमें कुछ समस्याएं हैं; जैसा कि उल्लेख किया गया है, आपको list को Py3 पर filter के परिणाम को प्रमाणित करना होगा, और प्रदर्शन के अनुसार, यह O(n**2) है; प्रत्येक remove कॉल O(n) है, और आप अनुमानतः csvlist में प्रत्येक तत्व के लिए एक प्रदर्शन कर सकते हैं।

एक अधिक कुशल, पोर्टेबल, और पाइथोनिक समाधान एक एकल पास में इनपुट को फ़िल्टर करने के लिए list समझ का उपयोग करना है, फिर csvlist की सामग्री को list समझ के परिणाम से बदलें। . यह केवल O(n) कुल कार्य है, और listcomps filter+lambda के फ़ंक्शन कॉल ओवरहेड से बच सकते हैं। बेहतर कोड है:

csvlist[:] = [x for x in csvlist if x[2].startswith('902')]

यह नया list उत्पन्न करता है, सभी अवांछित तत्वों को हटाता है, फिर csvlist की सामग्री को जगह में बदल देता है। यदि आपके पास csvlist का कोई अन्य संदर्भ नहीं है जिसे अद्यतन किया जाना चाहिए, तो आप एक छोटे से प्रदर्शन को बढ़ावा देने के लिए सादे असाइनमेंट (csvlist = ... के बजाय csvlist[:] = ...) के लिए स्लाइस असाइनमेंट छोड़ सकते हैं।

0
ShadowRanger 30 अगस्त 2018, 04:32