जांचें कि क्या पायथन सूची आइटम में एक स्ट्रिंग दूसरे स्ट्रिंग के अंदर है


586

मेरे पास एक सूची है:

my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']

और उन वस्तुओं की खोज करना चाहते हैं जिनमें तार शामिल हैं 'abc'। मैं उसे कैसे कर सकता हूँ?

if 'abc' in my_list:

अगर जाँच करेगा 'abc'सूची में मौजूद है, लेकिन यह का एक हिस्सा है 'abc-123'और 'abc-456', 'abc'अपने आप ही मौजूद नहीं है। तो मैं सभी आइटम कैसे प्राप्त कर सकता हूं 'abc'?


19
विपरीत की जांच करने के लिए (यदि एक स्ट्रिंग में कई तार शामिल हैं): stackoverflow.com/a/6531704/2436175
एंटोनियो

यदि प्रविष्टियों के बाएं भाग अद्वितीय हैं, तो सूची से एक तानाशाही का निर्माण करने पर विचार करें: आंशिक स्ट्रिंग के आधार पर सूची में प्रविष्टि खोजें
Georgy

जवाबों:


930

यदि आप abcसूची में किसी भी स्ट्रिंग की उपस्थिति की जांच करना चाहते हैं , तो आप कोशिश कर सकते हैं

some_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
if any("abc" in s for s in some_list):
    # whatever

यदि आप वास्तव में युक्त सभी वस्तुओं को प्राप्त करना चाहते हैं abc, तो उपयोग करें

matching = [s for s in some_list if "abc" in s]

मुझे यह देखना होगा कि एक आइटम 6 तत्वों की एक सरणी में है या नहीं। क्या यह 6 "अगर" है या यह एक ही है?
ओलिवियर पोंस

41
if myitem in myarray:
@ ऑलिवरपंस

8
'एबीसी' के विकल्प वाले सभी तारों को प्राप्त करने का एक और तरीका:filter(lambda element: 'abc' in element, some_list)
ड्रिफ्टकैचर

2
@ p014k: index()विधि का उपयोग करें :try: return mylist.index(myitem); except ValueError: pass
स्वेन मार्नाच

1
@ मिडीकिन: मुझे न तो समझ में आया कि आप वास्तव में क्या करना चाह रहे थे, न ही यह कैसे गलत हो गया। आपको शायद एक नया सवाल पूछकर ("प्रश्न पूछें" बटन के साथ) और अधिक भाग्य मिलेगा, अपने सटीक कोड की नकल करते हुए, आपने कोड को क्या करने की उम्मीद की होगी, और यह वास्तव में क्या किया था। "काम नहीं किया" पूरी तरह से व्यर्थ है जब तक आप परिभाषित नहीं करते हैं कि इस संदर्भ में "काम" का क्या मतलब है, लेकिन फिर भी यह समझाना बेहतर है कि वास्तव में क्या हुआ कहने के बजाय क्या हुआ।
स्वेन मार्नाच

104

बस इसे वहाँ से बाहर फेंकना: यदि आपको एक से अधिक स्ट्रिंग के विरुद्ध मैच करने की आवश्यकता होती है, उदाहरण के लिए abcऔर def, आप दो समझ को जोड़ सकते हैं:

matchers = ['abc','def']
matching = [s for s in my_list if any(xs in s for xs in matchers)]

आउटपुट:

['abc-123', 'def-456', 'abc-456']

4
यह वही था जो मैं के लिए googling था .. धन्यवाद!
N8TRO

2
आप उपयोग भी कर सकते हैं {s for s in my_list for xs in matchers if xs in s}(एक अद्वितीय सेट बनाने के लिए घुंघराले कोष्ठक पर ध्यान दें)। पढ़ने में आसान हो सकता है, लेकिन धीमी हो सकती है यदि अधिकांश sमूल्यों का एक मैच होगा, क्योंकि आपका anyपहला मैच कुशलतापूर्वक बंद हो जाएगा।
मत्तीस फ्राईप

82

filterउन तत्वों पर प्राप्त करने के लिए उपयोग करें जिनके पास हैabc

>>> lst = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
>>> print filter(lambda x: 'abc' in x, lst)
['abc-123', 'abc-456']

तुम भी एक सूची समझ का उपयोग कर सकते हैं।

>>> [x for x in lst if 'abc' in x]

वैसे, शब्द का उपयोग listएक चर नाम के रूप में नहीं करें क्योंकि यह पहले से ही listप्रकार के लिए उपयोग किया जाता है ।


50

यदि आपको यह जानना है कि क्या 'abc' किसी एक आइटम में है, तो यह सबसे छोटा तरीका है:

if 'abc' in str(my_list):

1
यह विफल होगा अगर आपके पास ["abc1", "1abc2"] की एक सूची थी क्योंकि यह एक मैच ढूंढ लेगा क्योंकि स्ट्रिंग 'abc' नए बनाए गए स्ट्रिंग में होगी
cgseller

2
हां, यह अभीष्ट व्यवहार है ... यदि किसी वस्तु में 'एबीसी' है तो सही है
रोजर्स

7
मुझे नहीं पता कि इन सभी अन्य लोगों ने उन जटिल लंबोदर समाधानों को करने का फैसला क्यों किया जब उन्हें ज़रूरत नहीं है! अच्छा काम @RogerS
ntk4 5

1
वास्तव में एक ही सवाल लगभग खुद ही जवाब देता है ... मैंने अभी इसमें 3 अक्षर जोड़े हैं।
रोजर्स 13:15 बजे

1
यह एक अच्छा समाधान है, लेकिन यदि आप उन वस्तुओं को ढूंढना चाहते हैं जिनमें दिए गए स्ट्रिंग शामिल हैं, तो आप सफल नहीं होंगे। यहां आपको पता चलता है कि क्या किसी आइटम में स्ट्रिंग है।
शलोट्टी

18

यह काफी पुराना प्रश्न है, लेकिन मैं इस उत्तर की पेशकश करता हूं क्योंकि पिछले उत्तर सूची में उन वस्तुओं के साथ सामना नहीं करते हैं जो तार नहीं हैं (या किसी प्रकार की चलने वाली वस्तु)। इस तरह की वस्तुएं पूरी सूची के अपवाद के साथ विफल होने का कारण बनती हैं।

गैर-पुन: उपयोग योग्य आइटमों को छोड़ कर सूची में ऐसी वस्तुओं के साथ शान से व्यवहार करने के लिए, निम्नलिखित का उपयोग करें:

[el for el in lst if isinstance(el, collections.Iterable) and (st in el)]

फिर, ऐसी सूची के साथ:

lst = [None, 'abc-123', 'def-456', 'ghi-789', 'abc-456', 123]
st = 'abc'

आप अभी भी मिलान आइटम प्राप्त करेंगे (['abc-123', 'abc-456'] )

पुनरावृत्ति के लिए परीक्षण सबसे अच्छा नहीं हो सकता है। इसे यहाँ से प्राप्त करें: पायथन में, मैं यह कैसे निर्धारित करूँ कि कोई वस्तु चलने योग्य है?


[el for el in lst if el and (st in el)]दिए गए उदाहरण में अधिक अर्थ नहीं होगा ?
गोर्डो

@tinix मैं नहीं है कि गैर-चलने योग्य वस्तुओं को इनायत से संभाल लेगा, है ना?
रॉबर्ट मुइल

"दिया गया उदाहरण" my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456'] इसे जटिल करने की आवश्यकता नहीं है।
गॉर्डो

1
हां बिल्कुल - स्वीकृत उत्तर पूरी तरह से उपयुक्त है और मेरा सुझाव अधिक जटिल है, इसलिए इसे अनदेखा करने के लिए स्वतंत्र महसूस करें - मुझे सिर्फ उसी स्थिति में पेश किया गया है जब किसी के पास एक ही समस्या थी: ऐसी सूचियों में गैर-पुनरावृत्ति वाली वस्तुएँ एक वास्तविक दुनिया की संभावना हैं दिए गए उदाहरण में विद्यमान नहीं होने के बावजूद।
रॉबर्ट मुइल


10
for item in my_list:
    if item.find("abc") != -1:
        print item

3
यदि आप इस दृष्टिकोण को लेने जा रहे हैं, तो मुझे लगता है कि इसका if 'abc' in itemउपयोग करना अधिक मुहावरेदार है item.find('abc') == -1
व्याट बाल्डविन


4

__contains__()पायथन स्ट्रिंग वर्ग की विधि का उपयोग करें :

a = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for i in a:
    if i.__contains__("abc") :
        print(i, " is containing")

3

मैं पायथन के लिए नया हूं। मुझे काम करने से नीचे कोड मिला और इसे समझना आसान हो गया:

my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for str in my_list:
    if 'abc' in str:
       print(str)


0
mylist=['abc','def','ghi','abc']

pattern=re.compile(r'abc') 

pattern.findall(mylist)

Python3.6 में यह एक त्रुटि देता है: TypeError: अपेक्षित स्ट्रिंग या बाइट्स जैसी वस्तु
AimForClarity

1
@AimForClarity हाँ p.thon3.6 में re.findall एक स्ट्रिंग की अपेक्षा करता है। सूची को स्ट्रिंग में परिवर्तित करके एक विकल्प होगा import re mylist=['abc','def','ghi','abcff'] my_list_string=''.join(mylist) string_to_find="abc" res=re.findall(string_to_find,my_list_string) print(res)
arun_munagala

1
खराब फॉर्मेटिंग के लिए क्षमा करें। किसी कारण से उचित लाइन ब्रेक नहीं कर सका।
arun_munagala

0

मैंने एक खोज की, जिसके लिए आपको एक निश्चित मान इनपुट करने की आवश्यकता है, फिर यह उस सूची से एक मूल्य की तलाश करेगा जिसमें आपका इनपुट शामिल है:

my_list = ['abc-123',
        'def-456',
        'ghi-789',
        'abc-456'
        ]

imp = raw_input('Search item: ')

for items in my_list:
    val = items
    if any(imp in val for items in my_list):
        print(items)

'एबीसी' के लिए खोज करने का प्रयास करें।



0

मुझे सूची सूचकांकों की आवश्यकता थी जो एक मैच के अनुरूप हैं:

lst=['abc-123', 'def-456', 'ghi-789', 'abc-456']

[n for n, x in enumerate(lst) if 'abc' in x]

उत्पादन

[0, 3]


-2

मेरे ज्ञान से, 'क' कथन हमेशा समय की खपत करेगा।

जब सूची की लंबाई बढ़ रही है, तो निष्पादन का समय भी बढ़ जाएगा।

मुझे लगता है कि, एक स्ट्रिंग में 'के साथ एक विकल्प खोजना' कथन थोड़ा तेज है।

In [1]: t = ["abc_%s" % number for number in range(10000)]

In [2]: %timeit any("9999" in string for string in t)
1000 loops, best of 3: 420 µs per loop

In [3]: %timeit "9999" in ",".join(t)
10000 loops, best of 3: 103 µs per loop

लेकिन, मैं सहमत हूं कि anyबयान अधिक पठनीय है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.