উত্তর:
if not a:
print("List is empty")
ব্যবহার অন্তর্নিহিত booleanness খালি list
বেশ pythonic হয়।
if a == []
একটি নির্দিষ্ট ধরণের ( () == []
is False
) জোর করে is এখানে, সাধারণ sensকমত্য বলে মনে হচ্ছে যে হাঁসের টাইপিং জিতেছে (ফলস্বরূপ, এটি __nonzero__
শূন্যতার ডকস.প্যাথন.আর. / রেফারেন্স / ডাডামোডেল। html#object.__nonzero__ ) পরীক্ষা করার ইন্টারফেস
এটি করার অজগর উপায়টি হল পিইপি 8 স্টাইল গাইড (যেখানে হ্যাঁর অর্থ "প্রস্তাবিত" এবং কোনও অর্থ "প্রস্তাবিত নয়"):
সিকোয়েন্সগুলির জন্য, (স্ট্রিং, তালিকাগুলি, টিপলস) খালি সিকোয়েন্সগুলি মিথ্যা রয়েছে তা ব্যবহার করুন।
Yes: if not seq: if seq: No: if len(seq): if not len(seq):
seq
এটি কোনও ধরণের তালিকার মতো অবজেক্ট হিসাবে প্রত্যাশিত better
আমি এটিকে স্পষ্টভাবে পছন্দ করি:
if len(li) == 0:
print('the list is empty')
এইভাবে এটি 100% স্পষ্ট যে li
এটি একটি ক্রম (তালিকা) এবং আমরা এর আকারটি পরীক্ষা করতে চাই। আমার সমস্যাটি if not li: ...
হ'ল এটি মিথ্যা ধারণা দেয় li
যা একটি বুলিয়ান পরিবর্তনশীল।
li
এটিকে একেবারেই শান্ত মনে করবে না , এবং যত্ন নেবে না । যদি এটি গুরুত্বপূর্ণ হয়, আপনার একটি মন্তব্য যুক্ত করা উচিত, আরও কোড নয়।
None
বা কারণ 0
পাস করার চেয়ে ব্যতিক্রম বাড়াতে)। সুতরাং যখন আপনি কোন কারণে, যে জন্য এটা করতে বিভ্রান্তিকর-এবং এটি মানে হল যখন আপনার কোড আছে পার্থক্য করতে প্রয়োজন নেই, পার্থক্য অদৃশ্য কারণ আপনি "চিৎকার করে বললেন নেকড়ে" সব উৎস বাকি ওভার করেছি।
if bool(len(li) == 0) is True:
?
এটি "পাইথন টেস্ট ফাঁকা অ্যারে" এবং অনুরূপ প্রশ্নের জন্য প্রথম গুগল হিট, অন্য লোকেরা কেবল তালিকা তালিকার বাইরে প্রশ্নকে সাধারণীকরণ করে বলে মনে হয়, তাই আমি ভেবেছিলাম যে আমি ভিন্ন ধরণের ক্রমের জন্য একটি ক্যাভিয়েট যুক্ত করব যে প্রচুর লোক ব্যবহার করতে পারে।
আপনাকে NumPy অ্যারেগুলি সম্পর্কে সতর্কতা অবলম্বন করা উচিত, কারণ অন্যান্য পদ্ধতিগুলি যেগুলি list
বা অন্যান্য স্ট্যান্ডার্ড পাত্রে NumPy অ্যারেগুলির জন্য সূক্ষ্ম কাজ করে। আমি নীচে কেন তা ব্যাখ্যা করছি, তবে সংক্ষেপে, পছন্দসই পদ্ধতিটি ব্যবহার করা size
।
"Pythonic" পথ NumPy অ্যারে সঙ্গে ব্যর্থ কারণ NumPy একটি অ্যারের অ্যারের নিক্ষেপ করার চেষ্টা করে bool
s, এবং if x
চেষ্টা ঐ সব মূল্যায়নের bool
সমষ্টিগত সত্য মান কোন ধরণের জন্য একবারে গুলি। তবে এটি কোনও অর্থবোধ করে না, সুতরাং আপনি এটি পান ValueError
:
>>> x = numpy.array([0,1])
>>> if x: print("x")
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
তবে কমপক্ষে উপরের কেসটি আপনাকে বলে যে এটি ব্যর্থ হয়েছে। আপনার যদি ঠিক একটি উপাদানের সাথে একটি নুমপি অ্যারে থাকে তবে if
বিবৃতিটি "কাজ করবে" এই অর্থে যে আপনি কোনও ত্রুটি পাবেন না। তবে, যদি সেই একটি উপাদানটি 0
(বা 0.0
, বা False
, ...) হয়ে থাকে তবে if
বিবৃতিটি ভুলভাবে ফলাফল করবে False
:
>>> x = numpy.array([0,])
>>> if x: print("x")
... else: print("No x")
No x
তবে স্পষ্টভাবে x
বিদ্যমান এবং খালি নেই! এই ফলাফলটি আপনি চেয়েছিলেন তা নয়।
len
অপ্রত্যাশিত ফলাফল দিতে পারেউদাহরণ স্বরূপ,
len( numpy.zeros((1,0)) )
অ্যারেতে শূন্য উপাদান থাকা সত্ত্বেও 1 প্রদান করে।
সায়পাই এফএকিউ-তে ব্যাখ্যা করা হয়েছে যে সমস্ত ক্ষেত্রেই আপনি জানেন যে আপনার কাছে নম্পপি অ্যারে রয়েছে সঠিক পদ্ধতিটি হ'ল if x.size
:
>>> x = numpy.array([0,1])
>>> if x.size: print("x")
x
>>> x = numpy.array([0,])
>>> if x.size: print("x")
... else: print("No x")
x
>>> x = numpy.zeros((1,0))
>>> if x.size: print("x")
... else: print("No x")
No x
এটি যদি একটি list
, নুমপি অ্যারে বা অন্য কিছু হতে পারে তা আপনি যদি নিশ্চিত না হন তবে আপনি এই পদ্ধতির সাথে উত্তরটি সংযুক্ত করতে পারেন @ সন্দেহভাজনজিম প্রতিটি ধরণের জন্য সঠিক পরীক্ষাটি ব্যবহার করা হয়েছে তা নিশ্চিত করে। খুব "পাইথোনিক" নয়, তবে এটি প্রমাণিত হয়েছে যে নম্পপি ইচ্ছাকৃতভাবে কমপক্ষে এই অর্থে অজগরটিকে ভেঙেছে।
যদি আপনাকে কেবল ইনপুটটি খালি আছে কিনা তা পরীক্ষা করে দেখার প্রয়োজন হয় এবং আপনি অন্যান্য নুমপি বৈশিষ্ট্য যেমন ইনডেক্সিং বা গণিত ক্রিয়াকলাপগুলি ব্যবহার করছেন তবে ইনপুটটিকে নুমপি অ্যারে হিসাবে বাধ্য করা সম্ভবত আরও দক্ষ (এবং অবশ্যই আরও সাধারণ) । এটি দ্রুত করার জন্য কয়েকটি দুর্দান্ত ফাংশন রয়েছে - সর্বাধিক গুরুত্বপূর্ণ numpy.asarray
। এটি আপনার ইনপুট নেয়, এটি ইতিমধ্যে কোনও অ্যারে থাকলে কিছুই করে না, বা আপনার ইনপুটটিকে কোনও তালিকা, টুপল ইত্যাদিতে আবদ্ধ করে এবং andচ্ছিকভাবে এটি আপনার নির্বাচিতকে রূপান্তর করে dtype
। সুতরাং এটি যখনই হতে পারে খুব দ্রুত এবং এটি নিশ্চিত করে যে আপনি কেবল ইনপুটটি একটি NumPy অ্যারে ধরে নিয়েছেন। আমরা সাধারণত এমনকি একই নামটি ব্যবহার করি, কারণ একটি অ্যারেতে রূপান্তরকরণ এটি বর্তমান সুযোগের বাইরে ফিরিয়ে আনবে না :
x = numpy.asarray(x, dtype=numpy.double)
এটি x.size
এই পৃষ্ঠায় যে সমস্ত ক্ষেত্রে আমি দেখছি তাতে চেকটি কাজ করবে ।
numpy
- numpy
এটি একটি খুব নির্দিষ্ট ব্যবহারের ক্ষেত্রে একটি লাইব্রেরি এবং এটির ক্ষেত্রে সত্যতা কী তার একটি আলাদা 'প্রাকৃতিক' সংজ্ঞা রয়েছে ধারকগুলির জন্য পাইথন স্ট্যান্ডার্ড। এটা তোলে ভাবে যে ক্ষেত্রে জন্য নিখুত জ্ঞান করে তোলে, যে pathlib
ব্যবহারসমূহ /
পরিবর্তে CONCATENATE পাথ +
- এটা অ-মানক, কিন্তু প্রেক্ষাপটে জ্ঞান করে তোলে।
if x
এবং প্রতিমা উভয়ের জন্য হাঁসের টাইপিং ভাঙ্গার পছন্দ করেছে len(x)
- এবং কখনও কখনও এই ভাঙ্গা সনাক্ত করা এবং ডিবাগ করা খুব কঠিন হতে পারে।
কোনও তালিকা খালি আছে কিনা তা যাচাই করার সর্বোত্তম উপায়
উদাহরণস্বরূপ, নিম্নলিখিতটি পাস হলে:
a = []
একটি খালি আছে কিনা তা আমি কীভাবে চেক করব?
একটি বুলিয়ান প্রেক্ষাপটে তালিকা রাখুন (উদাহরণস্বরূপ, একটি সঙ্গে if
বা while
বিবৃতি)। এটি False
খালি আছে কিনা তা পরীক্ষা করবে এবং True
অন্যথায়। উদাহরণ স্বরূপ:
if not a: # do this!
print('a is an empty list')
পাইপ 8 , পাইথনের স্ট্যান্ডার্ড লাইব্রেরিতে পাইথন কোডের জন্য অফিসিয়াল পাইথন শৈলীর গাইড, দৃser়ভাবে দাবি করে:
সিকোয়েন্সগুলির জন্য, (স্ট্রিং, তালিকাগুলি, টিপলস) খালি সিকোয়েন্সগুলি মিথ্যা রয়েছে তা ব্যবহার করুন।
Yes: if not seq: if seq: No: if len(seq): if not len(seq):
আমাদের আশা করা উচিত যে স্ট্যান্ডার্ড লাইব্রেরি কোডটি যথাসম্ভব পারফরম্যান্ট এবং সঠিক হওয়া উচিত। তবে কেন এটি হল এবং কেন আমাদের এই নির্দেশিকাটির দরকার?
আমি প্রায়শই পাইথনে নতুন অভিজ্ঞ প্রোগ্রামারদের কাছ থেকে এই জাতীয় কোড দেখতে পাই:
if len(a) == 0: # Don't do this!
print('a is an empty list')
এবং অলস ভাষার ব্যবহারকারীরা এটি করার জন্য প্রলুব্ধ হতে পারে:
if a == []: # Don't do this!
print('a is an empty list')
এগুলি তাদের নিজ নিজ অন্যান্য ভাষায় সঠিক। এবং পাইথনে এটি শব্দার্থগতভাবে সঠিক।
তবে আমরা একে অ-পাইথোনিক হিসাবে বিবেচনা করি কারণ পাইথন এই শব্দার্থকগুলিকে সরাসরি বুলিয়ান জবরদস্তির মাধ্যমে তালিকার অবজেক্টের ইন্টারফেসে সমর্থন করে।
দস্তাবেজগুলি থেকে (এবং বিশেষ করে খালি তালিকার অন্তর্ভুক্তির বিষয়টি লক্ষ্য করুন []
):
ডিফল্টরূপে, অবজেক্টটিকে সত্য হিসাবে বিবেচনা করা হয় যদি না তার শ্রেণি দ্বারা হয় এমন কোনও
__bool__()
পদ্ধতি নির্ধারণ করা হয় যা প্রত্যাবর্তনের সাথে ডাকা হয়False
বা ফিরে আসে এমন কোনও__len__()
পদ্ধতি যা শূন্য ফিরে আসে। এখানে বেশিরভাগ বিল্ট-ইন অবজেক্টকে মিথ্যা হিসাবে বিবেচনা করা হচ্ছে:
- ধ্রুবকগুলি মিথ্যা হিসাবে সংজ্ঞায়িত:
None
এবংFalse
।- কোনো সাংখ্যিক ধরনের শূন্য:
0
,0.0
,0j
,Decimal(0)
,Fraction(0, 1)
- খালি সিকোয়েন্স এবং সংগ্রহগুলি:
''
,()
,[]
,{}
,set()
,range(0)
এবং ডেটামোডেল ডকুমেন্টেশন:
সত্য মান পরীক্ষা এবং বিল্ট-ইন অপারেশন বাস্তবায়নের জন্য আহ্বান
bool()
; ফিরে আসা উচিতFalse
বাTrue
। এই পদ্ধতিটি সংজ্ঞায়িত না__len__()
হলে তাকে বলা হয়, এটি সংজ্ঞায়িত হলে এবং অবজেক্টটিকে সত্য হিসাবে বিবেচনা করা হয় যদি এর ফলাফলটি ননজারো হয়। যদি কোনও শ্রেণি বা উভয়কেই সংজ্ঞায়িত করে না__len__()
তবে এর__bool__()
সমস্ত উদাহরণ সত্য হিসাবে বিবেচিত হবে।
এবং
বিল্ট-ইন ফাংশনটি বাস্তবায়নের জন্য ডেকে আনা হয়েছে
len()
। অবজেক্টের দৈর্ঘ্য, একটি পূর্ণসংখ্যা = = ০ ফিরিয়ে নেওয়া উচিত, এছাড়াও, এমন একটি বস্তু যা কোনও__bool__()
পদ্ধতি সংজ্ঞায়িত করে না এবং যার__len__()
পদ্ধতিটি শূন্য ফেরায় তাকে বুলিয়ান প্রসঙ্গে মিথ্যা হিসাবে বিবেচনা করা হয়।
সুতরাং এর পরিবর্তে:
if len(a) == 0: # Don't do this!
print('a is an empty list')
অথবা এটা:
if a == []: # Don't do this!
print('a is an empty list')
এটা কর:
if not a:
print('a is an empty list')
এটি কি পরিশোধ করে? (নোট করুন যে একটি সমমানের অপারেশন করার জন্য কম সময় ভাল হয় :)
>>> import timeit
>>> min(timeit.repeat(lambda: len([]) == 0, repeat=100))
0.13775854044661884
>>> min(timeit.repeat(lambda: [] == [], repeat=100))
0.0984637276455409
>>> min(timeit.repeat(lambda: not [], repeat=100))
0.07878462291455435
স্কেল জন্য, এখানে ফাংশনটি কল করা এবং একটি খালি তালিকা তৈরি এবং ফিরিয়ে দিতে ব্যয় করতে হবে, যা আপনি উপরে ব্যবহৃত শূন্যতার চেকগুলির ব্যয় থেকে বিয়োগ করতে পারেন:
>>> min(timeit.repeat(lambda: [], repeat=100))
0.07074015751817342
আমরা দেখতে পাই যে হয় বিল্টিন ফাংশনটির len
সাথে তুলনা করে দৈর্ঘ্যের জন্য পরীক্ষা করা 0
বা খালি তালিকার বিপরীতে পরীক্ষা করা ডকুমেন্ট হিসাবে ভাষাটির বিল্টিন সিনট্যাক্স ব্যবহার করার চেয়ে অনেক কম পারফর্মেন্ট।
কেন?
জন্য len(a) == 0
চেক:
প্রথম পাইথনকে ছায়াছবি কিনা তা দেখতে গ্লোবালগুলি পরীক্ষা করতে হবে len
।
তারপরে এটি অবশ্যই ফাংশনটি কল করবে, লোড করতে হবে 0
এবং পাইথনে সমতা তুলনা করতে হবে (সি এর পরিবর্তে):
>>> import dis
>>> dis.dis(lambda: len([]) == 0)
1 0 LOAD_GLOBAL 0 (len)
2 BUILD_LIST 0
4 CALL_FUNCTION 1
6 LOAD_CONST 1 (0)
8 COMPARE_OP 2 (==)
10 RETURN_VALUE
এবং এর জন্য এটি [] == []
একটি অপ্রয়োজনীয় তালিকা তৈরি করতে হবে এবং তারপরে আবার পাইথনের ভার্চুয়াল মেশিনে তুলনামূলক কাজটি করতে হবে (সি এর বিপরীতে)
>>> dis.dis(lambda: [] == [])
1 0 BUILD_LIST 0
2 BUILD_LIST 0
4 COMPARE_OP 2 (==)
6 RETURN_VALUE
"পাইথোনিক" উপায়টি বস্তুর দৃষ্টান্ত শিরোনামে তালিকার দৈর্ঘ্য ক্যাশে হওয়ায় এটি অনেক সহজ এবং দ্রুত চেক:
>>> dis.dis(lambda: not [])
1 0 BUILD_LIST 0
2 UNARY_NOT
4 RETURN_VALUE
এটি ক্ষেত্রটি
PyObject
যুক্ত করে এটির একটি এক্সটেনশনob_size
। এটি কেবলমাত্র এমন বস্তুর জন্য ব্যবহৃত হয় যার দৈর্ঘ্যের কিছু ধারণা রয়েছে। এই ধরণটি পাইথন / সি এপিআই তে প্রায়শই উপস্থিত হয় না। এটিPyObject_VAR_HEAD
ম্যাক্রোর সম্প্রসারণ দ্বারা সংজ্ঞায়িত ক্ষেত্রগুলির সাথে মিলে যায় ।
অন্তর্ভুক্ত / listobject.h এ সি উত্স থেকে :
typedef struct {
PyObject_VAR_HEAD
/* Vector of pointers to list elements. list[0] is ob_item[0], etc. */
PyObject **ob_item;
/* ob_item contains space for 'allocated' elements. The number
* currently in use is ob_size.
* Invariants:
* 0 <= ob_size <= allocated
* len(list) == ob_size
আমি নির্দেশ করবে যে এটি সঙ্গে খালি নয় এমন ক্ষেত্রে যদিও তার প্রশংসনীয় কুশ্রী জন্য সত্য
l=[]
তারপর%timeit len(l) != 0
90.6 NS ± 8.3 NS,%timeit l != []
55.6 NS ± 3.09,%timeit not not l
38.5 NS ± 0,372। কিন্তুnot not l
ট্রিপল স্পিড সত্ত্বেও কেউ উপভোগ করতে যাচ্ছে এমন কোনও উপায় নেই । এটি হাস্যকর দেখাচ্ছে। তবে গতিটি জিততে পারে বলে
আমি মনে করি যে সমস্যাটি সময়সীমার সাথে টেস্ট করছে যেহেতুif l:
যথেষ্ট যথেষ্ট তবে আশ্চর্যের সাথে%timeit bool(l)
101 টি এনএস ± 2.64 এনএস দেয়। আকর্ষণীয় এই জরিমানা ব্যতীত বুল করতে বাধ্য করার কোনও উপায় নেই।%timeit l
কোনওরকম রূপান্তর ঘটবে না বলে এটি অকেজো।
আইপিথন যাদু,, %timeit
এখানে সম্পূর্ণ অকেজো নয়:
In [1]: l = []
In [2]: %timeit l
20 ns ± 0.155 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
In [3]: %timeit not l
24.4 ns ± 1.58 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [4]: %timeit not not l
30.1 ns ± 2.16 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
আমরা প্রতিটি অতিরিক্ত জন্য not
এখানে রৈখিক ব্যয় একটি বিট দেখতে পারেন । আমরা ব্যয়গুলি দেখতে চাই, সেটিরিস পেরিবাস , অর্থাত্ সমস্ত সমান - যেখানে যতদূর সম্ভব সর্বনিম্ন করা হয়েছে:
In [5]: %timeit if l: pass
22.6 ns ± 0.963 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [6]: %timeit if not l: pass
24.4 ns ± 0.796 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [7]: %timeit if not not l: pass
23.4 ns ± 0.793 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
এখন আসুন বেকারত্বের তালিকার জন্য কেসটি দেখুন:
In [8]: l = [1]
In [9]: %timeit if l: pass
23.7 ns ± 1.06 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [10]: %timeit if not l: pass
23.6 ns ± 1.64 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [11]: %timeit if not not l: pass
26.3 ns ± 1 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
আমরা এখানে যা দেখতে পাচ্ছি তা হ'ল আপনি bool
কন্ডিশন চেক বা তালিকার নিজের তালিকায় প্রকৃতভাবে পাস করেছেন কিনা এবং কিছু যদি তালিকাটি দেওয়া হয় তেমনি দ্রুততর হয় কিনা তাতে কিছুটা পার্থক্য নেই ।
পাইথন সিতে লেখা; এটি সি স্তরে এর যুক্তি ব্যবহার করে। পাইথনে আপনি যা কিছু লিখবেন তা ধীর হবে। এবং আপনি সম্ভবত পাইথনের মধ্যে নির্মিত মেকানিজমগুলি ব্যবহার না করেই সম্ভবত এটি প্রস্থের ধীর গতির আদেশ হতে পারে।
l=[]
তারপর %timeit len(l) != 0
90.6 NS ± 8.3 NS, %timeit l != []
55.6 NS ± 3.09, %timeit not not l
38.5 NS ± 0,372। কিন্তু not not l
ট্রিপল স্পিড সত্ত্বেও কেউ উপভোগ করতে যাচ্ছে এমন কোনও উপায় নেই । এটি হাস্যকর দেখাচ্ছে। কিন্তু গতিটি জিতে যায়
if l:
যথেষ্ট যথেষ্ট তবে আশ্চর্যজনকভাবে %timeit bool(l)
101 এনএস ± 2.64 এনএস দেয়। আকর্ষণীয় এই জরিমানা ব্যতীত বুল করতে বাধ্য করার কোনও উপায় নেই। %timeit l
কোনওরকম রূপান্তর ঘটবে না বলে এটি অকেজো।
খালি তালিকা নিজেই সত্য মান পরীক্ষায় মিথ্যা বলে বিবেচিত হয় ( অজগর ডকুমেন্টেশন দেখুন ):
a = []
if a:
print "not empty"
@ ড্যারেন টমাস
সম্পাদনা: খালি তালিকাটিকে মিথ্যা হিসাবে পরীক্ষা করার বিরুদ্ধে আরেকটি বিষয়: বহুকর্ম সম্পর্কে কী বলা যায়? আপনার তালিকাগুলির উপর নির্ভর করা উচিত নয়। এটি ঠিক হাঁসের মতো ঝাঁকুনি দেওয়া উচিত - আপনি যখন নিজের হাঁস সংগ্রহকে '' ফ্যালস '' কোয়েস্ট করতে যাচ্ছেন তবে এর কোনও উপাদান নেই?
আপনার হাঁসের সংগ্রহটি বাস্তবায়ন করা উচিত __nonzero__
বা __len__
তাই যদি একটি: সমস্যা ছাড়াই কাজ করবে।
[] == False
মিথ্যাতে যদিও মূল্যায়ন করবে
bool()
। প্রত্যাশিত হিসাবে bool([]) == False
মূল্যায়ন True
করবে।
প্যাট্রিকের (গৃহীত) উত্তরটি সঠিক: if not a:
এটি করার সঠিক উপায়। হারলে হলকম্বের উত্তরটি সঠিক যে এটি পিইপি 8 স্টাইল গাইডে রয়েছে। তবে উত্তরের কোনটিই ব্যাখ্যা করে না তা হ'ল আইডিয়মটি অনুসরণ করা কেন একটি ভাল ধারণা you এমনকি আপনি ব্যক্তিগতভাবে এটি রুবি ব্যবহারকারীদের বা এটি যাই হোক না কেন যথেষ্ট পরিমাণে বিভ্রান্তিকর হিসাবে খুঁজে পান না find
পাইথন কোড এবং পাইথন সম্প্রদায়ের কাছে খুব শক্ত প্রতিমা রয়েছে। এই আইডিয়োমগুলি অনুসরণ করা পাইথনের অভিজ্ঞ কারও পক্ষে আপনার কোডটি পড়া সহজ করে তোলে। এবং আপনি যখন এই প্রতিমাগুলি লঙ্ঘন করেন, এটি একটি শক্ত সংকেত।
এটি সত্য যে if not a:
খালি তালিকাগুলি None
, বা সংখ্যা 0, বা খালি টিপলস, বা খালি ব্যবহারকারী-তৈরি সংগ্রহের ধরণগুলি, বা খালি ব্যবহারকারী-তৈরি না-যথেষ্ট-সংগ্রহের ধরণের, বা একক উপাদান নুমপি অ্যারে মিথ্যা দিয়ে স্কেলার হিসাবে অভিনয় করে না মান ইত্যাদি। এবং কখনও কখনও এটি সম্পর্কে স্পষ্ট হওয়া জরুরী। এবং সেক্ষেত্রে আপনি জানেন যে আপনি কী সম্পর্কে স্পষ্ট হতে চান, তাই আপনি ঠিক এটির জন্য পরীক্ষা করতে পারেন। উদাহরণস্বরূপ, এর if not a and a is not None:
অর্থ "কিছুই বাদে মিথ্যা কিছু", এর if len(a) != 0:
অর্থ "কেবল খালি অনুক্রম — এবং অনুক্রমের বাইরে অন্য কিছু এখানে একটি ত্রুটি" এবং আরও অনেক কিছু। আপনি যা পরীক্ষা করতে চান ঠিক তার জন্য পরীক্ষার পাশাপাশি এটি এই পাঠককেও গুরুত্বপূর্ণ যে এই পরীক্ষাটি গুরুত্বপূর্ণ।
তবে যখন আপনার কাছে স্পষ্ট করার মতো কিছু নেই if not a:
, পাঠককে বিভ্রান্ত করছে। আপনি যখন গুরুত্বপূর্ণ কিছু তেমন সংকেত দিচ্ছেন না। (আপনি কোড কম নমনীয় উপার্জন করতে পারে না বা ধীর, অথবা যাই হোক না কেন, কিন্তু যে সব কম গুরুত্বপূর্ণ।) এবং যদি আপনি অভ্যাসগত ভাবেই ভালো পাঠক বিভ্রান্ত, তারপর যখন আপনি কি একটি পার্থক্য করতে প্রয়োজন নেই, এটা অলক্ষিত কারণ পাস যাচ্ছে আপনি আপনার কোড জুড়ে "কান্নার নেকড়ে" ছিলেন।
তালিকার প্রথম স্থানে পরীক্ষা করার প্রয়োজনের বিষয়ে কেউই সম্বোধন করেছেন বলে মনে হয় না। আপনি কোনও অতিরিক্ত প্রসঙ্গ সরবরাহ না করায়, আমি কল্পনা করতে পারি যে আপনাকে প্রথমে এই চেকটি করার দরকার নেই, তবে পাইথনের লিস্ট প্রসেসিংয়ের সাথে অপরিচিত।
আমি তর্ক করব যে সর্বাধিক পাইথোনিক উপায় হ'ল একেবারে পরীক্ষা করা নয়, বরং কেবল তালিকাটি প্রক্রিয়া করা। এইভাবে এটি খালি বা পূর্ণ কিনা সঠিক কাজ করবে।
a = []
for item in a:
<do something with item>
<rest of code>
এই কোন বিষয়বস্তু হ্যান্ডলিং সুবিধা রয়েছে একটি , যখন শূন্যতা এর জন্য কোনো সুনির্দিষ্ট চেক প্রয়োজন নেই। যদি একটি খালি থাকে, নির্ভরশীল ব্লকটি কার্যকর হবে না এবং অনুবাদকটি পরবর্তী লাইনে যাবে।
আপনার যদি শূন্যতার জন্য অ্যারেটি পরীক্ষা করতে হয় তবে অন্য উত্তরগুলি যথেষ্ট।
<rest of code>
যা for
লুপ থেকে ফলাফলটি ব্যবহার করতে পারে ? অথবা সরাসরি কিছু মান ব্যবহার করবেন a
? আসলে, যদি স্ক্রিপ্টটি কঠোরভাবে নিয়ন্ত্রিত ইনপুট দিয়ে চালিত করার জন্য ডিজাইন করা হয় তবে চেকটি কিছুটা অপ্রয়োজনীয় হতে পারে। তবে বেশিরভাগ ক্ষেত্রে, ইনপুটটি পরিবর্তিত হয় এবং চেক করা সাধারণত ভাল হয়।
len()
পাইথন তালিকাগুলি, স্ট্রিং, ডিক্টস এবং সেটগুলির জন্য ও (1) অপারেশন । পাইথন অভ্যন্তরীণভাবে এই ধারকগুলির উপাদানগুলির সংখ্যা ট্র্যাক করে।
জাভাস্ক্রিপ্টে সত্যবাদী / মিথ্যা ধারণাটির অনুরূপ ধারণা রয়েছে ।
আমি লিখেছিলাম:
if isinstance(a, (list, some, other, types, i, accept)) and not a:
do_stuff
যা ভোট হয়েছিল -১। আমি নিশ্চিত না কারণ এটি কারণ কারণ পাঠকরা কৌশলটির বিরুদ্ধে আপত্তি করেছিলেন বা ভেবেছিলেন যে উত্তরটি উপস্থাপিত হিসাবে সহায়ক ছিল না। আমি ভান করব এটি পরে, কারণ --- যাইহোক "পাইথোনিক" হিসাবে গণ্য --- এটি সঠিক কৌশল। আপনি যদি ইতিমধ্যে বাতিল না হয়ে থাকেন বা a
উদাহরণস্বরূপ যেখানে মামলাগুলি পরিচালনা করতে প্রস্তুত না হন তবে False
আপনার বিচারের চেয়ে বিচারের চেয়ে আরও বেশি নিয়ন্ত্রণমূলক প্রয়োজন if not a:
। আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:
if isinstance(a, numpy.ndarray) and not a.size:
do_stuff
elif isinstance(a, collections.Sized) and not a:
do_stuff
প্রথম পরীক্ষাটি উপরের @ মাইক এর উত্তরের প্রতিক্রিয়াতে। তৃতীয় লাইনটি এর সাথে প্রতিস্থাপন করা যেতে পারে:
elif isinstance(a, (list, tuple)) and not a:
আপনি যদি কেবলমাত্র নির্দিষ্ট প্রকারের (এবং তাদের উপপ্রকার) উদাহরণগুলি গ্রহণ করতে চান বা এর সাথে:
elif isinstance(a, (list, tuple)) and not len(a):
আপনি সুস্পষ্ট ধরণের চেক ব্যতীত পালাতে পারবেন, তবে পার্শ্ববর্তী প্রসঙ্গ যদি ইতিমধ্যে আপনাকে আশ্বাস দেয় যে আপনি যে a
ধরণের হ্যান্ডেল করার জন্য প্রস্তুত তা ধরণের একটি মূল্য, বা আপনি যদি নিশ্চিত হন যে আপনি যে ধরণের হ্যান্ডেল করার জন্য প্রস্তুত নন তারা চলেছে ত্রুটি বাড়াতে (উদাহরণস্বরূপ, TypeError
যদি আপনি len
কোনও মানটির জন্য কল করেন যার জন্য এটি অপরিজ্ঞাত) আপনি হ্যান্ডেল করার জন্য প্রস্তুত prepared সাধারণভাবে, "পাইথোনিক" সম্মেলনগুলি এই শেষ পথে চলেছে বলে মনে হয়। এটিকে হাঁসের মতো চেপে ধরুন এবং কীভাবে কীভাবে কোচিং করা যায় তা যদি তা না জানেন তবে এটি একটি ডাকআরার বাড়িয়ে দিন। আপনার এখনও আছে কী ধরণের অনুমান করছেন তা চিন্তা করতে হবে এবং আপনি যে মামলাগুলি সঠিকভাবে পরিচালনা করার জন্য প্রস্তুত নন সেগুলি সঠিক জায়গায় ত্রুটি হয়ে চলেছে কিনা। নম্পি অ্যারে একটি ভাল উদাহরণ যেখানে কেবল অন্ধভাবে নির্ভর করেlen
বা বুলিয়ান টাইপাস্টাস্ট আপনার প্রত্যাশাটি ঠিক তা না করতে পারে।
collections.abc.Sized
বা collections.abc.Sequence
তবে তবে এটি আপনি নিজের লিখতে এবং লিখতে পারেন register(list)
। যদি আপনার কাছে এমন কোড থাকে যেখানে অন্যান্য মিথ্যা থেকে খালি আলাদা করা এবং অন্য তালিকাগুলি থেকে তালিকাগুলি এবং টিপলগুলি আলাদা করা গুরুত্বপূর্ণ, তবে এটি সঠিক — তবে আমি বিশ্বাস করি না যে আপনার কাছে এই জাতীয় কোড রয়েছে।
[]
এবং অন্য ধরণের মিথ্যা কিছু নয় তবে অবশ্যই if a == []:
আইসনস্ট্যান্সের সাথে ব্যঙ্গ করার চেয়ে বরং তাকে ডাকা হবে।
==
যদিও এর জন্য কিছু স্বয়ংক্রিয় জবরদস্তি রয়েছে । আমার মাথার উপরের অংশটি, আমি কোনওটির জন্য সনাক্ত করতে পারি না []
। [] == ()
উদাহরণস্বরূপ রিটার্ন False
। তবে উদাহরণস্বরূপ frozenset()==set()
রিটার্ন True
। সুতরাং এটি করার সময় কিছুটা অনাকাঙ্ক্ষিত প্রকারের []
(বা বিপরীতে) জোর করা যেতে পারে কিনা তা নিয়ে অন্তত কিছুটা চিন্তাভাবনা করা মূল্যবান a == []
।
সত্য মান পরীক্ষার উপর ডকুমেন্টেশন থেকে :
এখানে তালিকাভুক্ত যা ব্যতীত সমস্ত মান বিবেচিত হয় True
None
False
0
, 0.0
, 0j
।''
, ()
, []
।{}
,।__bool__()
বা __len__()
পদ্ধতি নির্ধারণ করে , যখন সেই পদ্ধতিটি পূর্ণসংখ্যা শূন্য বা বুল মান দেয় False
।দেখা যায়, খালি তালিকা []
হয় falsy , করছেন কি একটি বুলিয়ান মান শব্দসমূহ সবচেয়ে বেশি কার্যকরী করা হবে তাই হয়:
if not a:
print('"a" is empty!')
assert(not myList)
। আপনি যদি অবজেক্টটি হ'ল এটির অবস্থান নির্ধারণ করতে চান তবে আপনি এটি list
ব্যবহার করতে পারেন assertIsInstance()
।
তালিকা খালি কিনা তা এখানে কয়েকটি উপায় যাচাই করতে পারেন:
a = [] #the list
1) খুব সহজ অজগর উপায়:
if not a:
print("a is empty")
পাইথনে খালি পাত্রে যেমন তালিকা, টিপলস, সেট, ডিক্টস, ভেরিয়েবল ইত্যাদি হিসাবে দেখা হয় False
। একজন কেবল তালিকাকে একটি শিকার হিসাবে বিবেচনা করতে পারে ( একটি বুলিয়ান মান ফেরত )। এবং একটি True
মান ইঙ্গিত করবে যে এটি খালি নয়।
2) একটি সুস্পষ্ট উপায়: len()
দৈর্ঘ্যটি সন্ধান করতে এবং এটির সাথে সমান কিনা তা পরীক্ষা করে দেখুন 0
:
if len(a) == 0:
print("a is empty")
3) বা এটি কোনও বেনামে ফাঁকা তালিকার সাথে তুলনা করুন:
if a == []:
print("a is empty")
4) অন্য আর একটি নিখুঁত উপায় হ'ল ব্যবহার exception
এবং iter()
:
try:
next(iter(a))
# list has elements
except StopIteration:
print("Error: a is empty")
আমি নিম্নলিখিত পছন্দ:
if a == []:
print "The list is empty."
if not a:
এবং আরও সহজে ব্রেক হয়ে যায়। দয়া করে এটি করবেন না।
() == []
মিথ্যা সমান। যদিও আমি পছন্দ করি যে এই বাস্তবায়নটি if not a:
সমস্ত ক্ষেত্রে কভারগুলি কীভাবে পড়ে তা যদি আপনি অবশ্যই একটি তালিকা আশা করেন তবে আপনার উদাহরণটি যথেষ্ট sufficient
def list_test (L):
if L is None : print('list is None')
elif not L : print('list is empty')
else: print('list has %d elements' % len(L))
list_test(None)
list_test([])
list_test([1,2,3])
কখনও কখনও None
পৃথকভাবে শূন্যতার জন্য পরীক্ষা করা ভাল কারণ এগুলি দুটি ভিন্ন রাষ্ট্র। উপরের কোডটি নিম্নলিখিত আউটপুট উত্পাদন করে:
list is None
list is empty
list has 3 elements
যদিও এটি None
মিথ্যা কিছু মূল্য নেই । সুতরাং আপনি যদি পরীক্ষা-নিরীক্ষার জন্য পৃথক করতে না চান None
, আপনাকে এটি করতে হবে না।
def list_test2 (L):
if not L : print('list is empty')
else: print('list has %d elements' % len(L))
list_test2(None)
list_test2([])
list_test2([1,2,3])
প্রত্যাশিত উত্পাদন
list is empty
list is empty
list has 3 elements
অনেক উত্তর দেওয়া হয়েছে, এবং তাদের অনেকগুলি বেশ ভাল। আমি ঠিক যে চেক যোগ করতে চেয়েছিলেন
not a
None
খালি কাঠামোর জন্য এবং অন্যান্য ধরণের জন্যও পাস করবে । আপনি যদি সত্যিই খালি তালিকার জন্য চেক করতে চান তবে আপনি এটি করতে পারেন:
if isinstance(a, list) and len(a)==0:
print("Received an empty list")
a
এটি তালিকা না থাকে এবং a
কোনও পদ্ধতি __len__
প্রয়োগ করা হয় না। আমি সুপারিশ করব:if isinstance(obj, list): if len(obj) == 0: print '...'
and
পাইথনে অপারেটর অলস। and
শর্তটি and
মিথ্যা হলে এর পরে আর কিছুই কার্যকর করা হবে না ।
আমরা অন্য একটি সহজ ব্যবহার করতে পারে:
item_list=[]
if len(item_list) == 0:
print("list is empty")
else:
print("list is not empty")
আপনি যদি কোনও তালিকা খালি রাখেন কিনা তা পরীক্ষা করতে চান:
l = []
if l:
# do your stuff.
আপনি যদি তালিকার সমস্ত মান খালি কিনা তা পরীক্ষা করতে চান। তবে এটি True
খালি তালিকার জন্য হবে :
l = ["", False, 0, '', [], {}, ()]
if all(bool(x) for x in l):
# do your stuff.
আপনি উভয় ক্ষেত্রে একসাথে ব্যবহার করতে চাইলে:
def empty_list(lst):
if len(lst) == 0:
return False
else:
return all(bool(x) for x in l)
এখন আপনি ব্যবহার করতে পারেন:
if empty_list(lst):
# do your stuff.
@ সন্দেহভাজনজিমের সমাধান দ্বারা অনুপ্রাণিত হয়ে, আমি এটির পুনরাবৃত্তিযোগ্য কিছু কিনা এর অতিরিক্ত সাধারণ চেক ব্যবহার করার প্রস্তাব করছি
import collections
def is_empty(a):
return not a and isinstance(a, collections.Iterable)
দ্রষ্টব্য: একটি স্ট্রিংকে পুনরাবৃত্তিযোগ্য বলে মনে করা হয়। - and not isinstance(a,(str,unicode))
আপনি যদি খালি স্ট্রিংটি বাদ দিতে চান তবে যুক্ত করুন
টেস্ট:
>>> is_empty('sss')
False
>>> is_empty(555)
False
>>> is_empty(0)
False
>>> is_empty('')
True
>>> is_empty([3])
False
>>> is_empty([])
True
>>> is_empty({})
True
>>> is_empty(())
True
if a:
এটি এমন হত কারণ আমি কোনও ব্যতিক্রমী a
ধারক না হলে ব্যতিক্রম চাইতাম । ( পুনরাবৃত্তিযোগ্য হওয়ার কারণে পুনরাবৃত্তিরও অনুমতি দেওয়া হয়, যা শূন্যতার জন্য কার্যকরভাবে পরীক্ষা করা যায় না))
print('not empty' if a else 'empty')
আরও কিছুটা ব্যবহারিক:
a.pop() if a else None
এবং অতিতম সংস্করণ:
if a: a.pop()
পাইথন 3 থেকে আপনি ব্যবহার করতে পারেন
a == []
তালিকাটি খালি আছে কিনা তা পরীক্ষা করতে
সম্পাদনা: এটি পাইথন 2.7 এর সাথেও কাজ করে ..
এত জটিল উত্তর কেন আছে তা আমি নিশ্চিত নই। এটি বেশ পরিষ্কার এবং সোজা
a
খালি আছে কিনা তা কেবল এটি যাচাই করে ।
pythonic
a==[]
এটি ব্যবহার করেন তবে এটি খালি থাকলে পাইথন টার্মিনালে সত্য মুদ্রিত হবে। অন্যথায় এটি মিথ্যা মুদ্রণ করবে। আপনি এটি যদি কোনও শর্তের মধ্যেও ব্যবহার করতে পারেনif(a==[])
আপনি বুল () এর মতো ব্যবহার করে দেখতেও পারেন
a = [1,2,3];
print bool(a); # it will return True
a = [];
print bool(a); # it will return False
আমি চেক তালিকার জন্য এই ভাবে পছন্দ করি ফাঁকা বা না।
খুব সহজ এবং দরকারী।
bool()
পাইথন ভেরিয়েবলকে বুলিয়ানে রূপান্তরিত করেন যাতে আপনি যদি কোনও বিবৃতি ব্যবহার না করেই কোনও মানের সত্যতা বা মিথ্যাচার সঞ্চয় করতে পারেন। আমি মনে করি এটি কেবল স্বীকৃত উত্তরের মতো শর্তসাপেক্ষ ব্যবহারের চেয়ে কম পঠনযোগ্য, তবে আমি নিশ্চিত যে এর জন্য আরও ভাল ব্যবহারের কেস রয়েছে।
কেবল is_empty () ব্যবহার করুন বা এর মতো ফাংশন তৈরি করুন: -
def is_empty(any_structure):
if any_structure:
print('Structure is not empty.')
return True
else:
print('Structure is empty.')
return False
এটি কোনও ডাটা_ স্ট্রাকচারের জন্য তালিকার মতো, টিপলস, অভিধান এবং আরও অনেক কিছুর জন্য ব্যবহার করা যেতে পারে। এগুলি দ্বারা, আপনি ন্যায়বিচারটি ব্যবহার করে এটি বহুবার কল করতে পারেন is_empty(any_structure)
।
is_empty
প্রস্তাব দেয় যে এটি কিছু দেয়। তবে যদি এটি হয়ে থাকে তবে এটি কিছু হবে bool(any_structure)
, যা আপনার পরিবর্তে ব্যবহার করা উচিত ( যখন আপনার যখন একেবারেই প্রয়োজন bool
হয়)।
bool
স্ট্যান্ডার্ড আউটপুটে মেসেজ প্রিন্ট করে (তার মধ্যে) তারতম্য চাই ?
bool
ভেরিয়েবল ব্যবহার করে । সিদ্ধান্ত তোমার. আমি উভয়ই লিখি যাতে আপনি তাদের মধ্যে বেছে নিতে পারেন।
সহজ উপায় দৈর্ঘ্য সমান শূন্য পরীক্ষা করা হয়।
if len(a) == 0:
print("a is empty")
একটি খালি তালিকার সত্য মানটি False
যখন খালি শূন্য তালিকার জন্য থাকে True
।
যা আমাকে এখানে এনেছে তা একটি বিশেষ ব্যবহারের ক্ষেত্র: আমি আসলে কোনও ফাংশন চেয়েছিলাম আমাকে কোনও তালিকা ফাঁকা আছে কিনা তা বলার জন্য। আমি এখানে আমার নিজস্ব ফাংশন লিখতে বা ল্যাম্বডা-এক্সপ্রেশনটি ব্যবহার এড়াতে চেয়েছিলাম (কারণ মনে হয়েছিল এটি যথেষ্ট সহজ হওয়া উচিত):
foo = itertools.takewhile(is_not_empty, (f(x) for x in itertools.count(1)))
এবং, অবশ্যই এটি করার খুব স্বাভাবিক উপায় রয়েছে:
foo = itertools.takewhile(bool, (f(x) for x in itertools.count(1)))
অবশ্যই এটি (যেমন ) ব্যবহার করবেন না কারণ এটি নিহিত রয়েছে। তবে, ক্ষেত্রেগুলির জন্য যখন "খালি নয়" স্পষ্টভাবে একটি ফাংশন হিসাবে প্রয়োজন হয়, সর্বোত্তম পছন্দ।bool
if
if bool(L):
bool
কোনও তালিকা খালি আছে কিনা তা যাচাই করতে আপনি নিম্নলিখিত দুটি উপায় ব্যবহার করতে পারেন। তবে মনে রাখবেন, আমাদের এক ধরণের ক্রম (এটি একটি
less pythonic
উপায়) জন্য স্পষ্টভাবে চেক করার উপায়টি এড়ানো উচিত :
def enquiry(list1):
if len(list1) == 0:
return 0
else:
return 1
# ––––––––––––––––––––––––––––––––
list1 = []
if enquiry(list1):
print ("The list isn't empty")
else:
print("The list is Empty")
# Result: "The list is Empty".
দ্বিতীয় উপায় একটি
more pythonic
এক। এই পদ্ধতিটি চেক করার একটি অন্তর্নিহিত উপায় এবং আগেরটির চেয়ে অনেক বেশি পছন্দনীয়।
def enquiry(list1):
if not list1:
return True
else:
return False
# ––––––––––––––––––––––––––––––––
list1 = []
if enquiry(list1):
print ("The list is Empty")
else:
print ("The list isn't empty")
# Result: "The list is Empty"
আশাকরি এটা সাহায্য করবে.