তালিকা থেকে স্ট্রিংগুলির একটিতে স্ট্রিংটি শেষ হয় কিনা তা পরীক্ষা করে দেখুন


220

নিম্নলিখিত কোডটি লেখার অজগর উপায় কী?

extensions = ['.mp3','.avi']
file_name = 'test.mp3'

for extension in extensions:
    if file_name.endswith(extension):
        #do stuff

আমার একটি অস্পষ্ট স্মৃতি রয়েছে যে forলুপের সুস্পষ্ট ঘোষণা এড়ানো যায় এবং ifশর্তে লেখা যায় । এটা কি সত্য?


2
যদিও এই প্রশ্নের ভাল উত্তর দেওয়া হয়েছে, সম্ভবত লেখক মূলত ভেবেছিলেন if any((file_name.endswith(ext) for ext in extensions))
সাফ্ট

উত্তর:


450

যদিও বহুল পরিচিত নয়, স্ট্রেন্ডসেন্ডসও একটি টিপল গ্রহণ করে। আপনাকে লুপ করার দরকার নেই।

>>> 'test.mp3'.endswith(('.mp3', '.avi'))
True

10
আপনি জানেন কেন এটি কোনও তালিকা গ্রহণ করে না তবে একটি টিপল করে? শুধু কৌতূহলী
ilyail3

2
@ ফালসেটরু উত্তরের লিঙ্কটি এই প্রশ্নের স্পষ্টভাবে উত্তর দেয় না। এটি কেবল উল্লেখ করেছে যে এটি টিপলগুলি গ্রহণ করতে পারে , তবে কেন এটি তালিকা গ্রহণ করতে পারে না accept যেহেতু তারা উভয় অনুক্রম, আমি কেবলমাত্র পার্থক্যটি দেখতে পাচ্ছি যেগুলি তালিকাগুলি পরিবর্তনযোগ্য, যখন টিউপসগুলি পরিবর্তনযোগ্য। আমি ভুল হতে পারি, তবে কেন এটি স্পষ্টভাবে বলা হয়েছে তার অন্য কোনও কারণ আমি দেখতে পাচ্ছি না।
কিমিকোলোকো

4
যদি আপনি কোনও অক্ষর দিয়ে একটি স্ট্রিং শেষ হয় কিনা তা পরীক্ষা করতে চান:import string; str.endswith(tuple(string.ascii_lowercase))
অ্যালেক্স উইলিসন

3
কেবল একটি নোট, endswithকেবল অজগর 2.5 এবং তারপরের জন্য টুপল গ্রহণ করে
আকাশ সিং

1
এটা কখনই জানত না! এটা নিখুঁত!
বোকা জেসুস


6

ফাইলটি থেকে একটি এক্সটেনশান নিন এবং দেখুন এটি কোনও এক্সটেনশনের সেটে রয়েছে কিনা:

>>> import os
>>> extensions = set(['.mp3','.avi'])
>>> file_name = 'test.mp3'
>>> extension = os.path.splitext(file_name)[1]
>>> extension in extensions
True

একটি সেট ব্যবহার করা হচ্ছে কারণ সেটে লকআপের জন্য সময় জটিলতা হ'ল ও (1) ( ডক্স )।


8
আপনি দক্ষতার উল্লেখ হিসাবে কেবল লক্ষ করুন, মোটামুটি সংক্ষিপ্ত টিউপসগুলির জন্য, .endswith()একটি অভ্যন্তরীণ টুপল সহ একটি সেট লুকের চেয়ে দ্রুত হবে
জন ক্লিমেন্টস

@ জোনক্লিমেন্টস আমি মনে করি উত্তর এবং প্রশ্নগুলিতে দুর্দান্ত নোটগুলি তৈরি করার জন্য আপনার একটি বিশেষ এসও সোনার কমেন্ট ব্যাজ দরকার :)
অ্যালেক্স

নাহ - আমি কেবল "স্ট্যালকিং অ্যালেক্স্সি" ব্যাজটির জন্য যাচ্ছি;)
জন

2
এটি আরও লক্ষ করুন যে ২.7 এবং আরও নতুনতে আপনি আমাদের জন্য সেটগুলির জন্য গণিত বাক্য গঠন করতে পারেন {'.mp3','.avi'}, এটি অতিরিক্ত ধরণের রূপান্তর এড়িয়ে যায় এবং আপনার পটভূমির উপর নির্ভর করে আরও পঠনযোগ্য হতে পারে ('যদিও এটি অভিধানে বিভ্রান্তি সৃষ্টি করতে পারে এবং খালি তৈরি করতে ব্যবহার করা যায় না) সেট)।
পার্কিনস

@ জোনক্লিমেন্টস কোনও দিন আমি আপনার মত জ্ঞানী হয়ে
উঠব

3

দুটি উপায় আছে: নিয়মিত এক্সপ্রেশন এবং স্ট্রিং (স্ট্র) পদ্ধতি।

স্ট্রিং পদ্ধতিগুলি সাধারণত দ্রুত হয় (~ 2x)।

import re, timeit
p = re.compile('.*(.mp3|.avi)$', re.IGNORECASE)
file_name = 'test.mp3'
print(bool(t.match(file_name))
%timeit bool(t.match(file_name)

লুপ প্রতি 792 এনএস ± 1.83 এনএস (7 mean রানের গড় ± স্ট্যান্ড। ডিভ। প্রতি 1000000 লুপ)

file_name = 'test.mp3'
extensions = ('.mp3','.avi')
print(file_name.lower().endswith(extensions))
%timeit file_name.lower().endswith(extensions)

274 এনএস ± 4.22 এনএস প্রতি লুপ (অর্থাত্ ± স্ট্যান্ড। Runs রানের ডেভেল, প্রতি 1000000 লুপ)



1

আমি সবেমাত্র এটিকে পেরিয়ে এসেছি, অন্য কোনও কিছুর সন্ধান করার সময়

আমি osপ্যাকেজ পদ্ধতি সঙ্গে যেতে সুপারিশ করব । এর কারণ আপনি যেকোন অদ্ভুত মামলার ক্ষতিপূরণ দিয়ে এটি আরও সাধারণ করে তুলতে পারেন।

আপনি যেমন কিছু করতে পারেন:

import os

the_file = 'aaaa/bbbb/ccc.ddd'

extensions_list = ['ddd', 'eee', 'fff']

if os.path.splitext(the_file)[-1] in extensions_list:
    # Do your thing.

0

আইএন স্টেটমেন্ট ব্যবহার করা অন্য সম্ভাবনা হতে পারে:

extensions = ['.mp3','.avi']
file_name  = 'test.mp3'
if "." in file_name and file_name[file_name.rindex("."):] in extensions:
    print(True)

@ রেনাল্ড 62, সেই ক্ষেত্রে indexহওয়া উচিত rindex
নেভারহোপলেস

0

আর একটি উপায় যা মিলে যাওয়া স্ট্রিংয়ের তালিকাটি ফিরিয়ে দিতে পারে is

sample = "alexis has the control"
matched_strings = filter(sample.endswith, ["trol", "ol", "troll"])
print matched_strings
['trol', 'ol']
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.