मैं नियमित अभिव्यक्ति के आधार पर एक सूची में तार को फ़िल्टर करना चाहता हूं।
क्या इससे बेहतर कुछ है [x for x in list if r.match(x)]?
जवाबों:
आप Python 3.x में एक iterator बना सकते हैं या Python 2.x में एक सूची का उपयोग करके कर सकते हैं:
filter(r.match, list)
पायथन 3.x पुनरावृत्ति को एक सूची में बदलने के लिए, बस इसे कास्ट करें; list(filter(..))।
filterसंस्करण पूरी तरह से स्पष्ट है और इसमें बहुत कम शोर है।
r.matchयहाँ क्या है
r.matchएक विधि है, जो किसी दिए गए स्ट्रिंग पर लागू होती है, यह पता लगाता है कि क्या regex rउस स्ट्रिंग से मेल खाता है (और यदि ऐसा है तो संबंधित मैच ऑब्जेक्ट लौटाता है, लेकिन यह इस मामले में कोई फर्क नहीं पड़ता क्योंकि हम सिर्फ इस बात की परवाह करते हैं कि परिणाम सत्य है)
पूर्ण उदाहरण (पायथन 3):
पायथन के लिए 2.x नीचे नोट में देखें
import re
mylist = ["dog", "cat", "wildcat", "thundercat", "cow", "hooo"]
r = re.compile(".*cat")
newlist = list(filter(r.match, mylist)) # Read Note
print(newlist)
प्रिंटों:
['cat', 'wildcat', 'thundercat']
ध्यान दें:
पायथन 2.x डेवलपर्स के लिए, filterपहले से ही एक सूची लौटाता है। में अजगर 3.xfilter तो यह करने के लिए परिवर्तित किया जाना है पुनरावर्तक वापस जाने के लिए बदल गया था list(ताकि इसे अच्छी तरह से बाहर मुद्रित देखने के लिए)।
<filter object at 0x1057acda0>जो मैं गलत कर रहा हूं?
strसे filterएक सूची वापस कर दी है, कोई फायदा नहीं हुआ ...
print(list(newlist))याprint([i for i in newlist])
रेगेक्स को पहले संकलित किए बिना ऐसा करने के लिए, एक lambdaफ़ंक्शन का उपयोग करें - उदाहरण के लिए:
from re import match
values = ['123', '234', 'foobar']
filtered_values = list(filter(lambda v: match('^\d+$', v), values))
print(filtered_values)
यह दिखाता है:
['123', '234']
filter()बस callableयह पहली दलील के रूप में लेता है , और एक सूची देता है जहां उस कॉल करने योग्य ने एक 'सत्य' मान लौटाया।