ලැයිස්තුවක් හිස් දැයි මා පරීක්ෂා කරන්නේ කෙසේද?


3234

උදාහරණයක් ලෙස, පහත සඳහන් දෑ සම්මත වුවහොත්:

a = []

aහිස් දැයි බැලීමට මා පරීක්ෂා කරන්නේ කෙසේද ?

Answers:


5530
if not a:
  print("List is empty")

හිස් වල ව්‍යාජ බූලියන් භාවිතා listකිරීම තරමක් පයිතොනික් ය.


1134
යක්ෂයාගේ අධිනීති play යා සෙල්ලම් කිරීම. මෙම මෝඩකම පයිතොනික් ලෙස සලකන්නේ මන්දැයි මට තේරෙන්නේ නැත. 'පැහැදිළි කිරීම වඩා හොඳය, පසුව ගම්‍ය වේ', හරිද? මෙම චෙක්පත පරික්ෂා කරන්නේ කුමක් ද යන්න පිළිබඳ පැහැදිලි බවක් නොපෙනේ.
ජේම්ස් මැක් මහෝන්

223
@ ජේම්ස්එම්සී මහෝන් - එය පැහැදිලිකම සහ ටයිප් නම්යතාවය අතර හුවමාරුවකි. පොදුවේ ගත් කල, “පැහැදිළි වීම” යන්නෙන් අදහස් කරන්නේ “ඉන්ද්‍රජාලික” දේවල් නොකිරීමයි. අනෙක් අතට, "තාරා ටයිප් කිරීම" යන්නෙන් අදහස් කරන්නේ වර්ග සඳහා පැහැදිලිව පරීක්ෂා කරනවාට වඩා සාමාන්‍ය අතුරුමුහුණත් සමඟ වැඩ කිරීමයි. එබැවින් යම් if a == []වර්ගයකට බල කිරීම වැනි දෙයක් ( () == []වේ False). මෙහි, එකඟත්වයක් බව තාරා ටයිප් බව පෙනේ (කියා, ක්රියාත්මක පූර්ණ ජය __nonzero__හිස්බව පරීක්ෂා කිරීමේ අතුරු මුහුනත docs.python.org/reference/datamodel.html#object.__nonzero__ )
ඇන්ඩෘ කුක්

39
මෙම ක්‍රමය අංකිත අරා මත ක්‍රියා නොකරයි .. එබැවින් මම සිතන්නේ “තාරා ටයිප් කිරීම” සහ ව්‍යංගාර්ථය යන දෙකින්ම ලෙන් (අ) == 0 වඩාත් සුදුසු නම්.
වර්ෂිප් මහතා

10
C හි අරාවක් හිස් දැයි දැන ගැනීමේ කැනොනිකල් ක්‍රමය වන්නේ පළමු මූලද්‍රව්‍යය අවලංගු කර එය ශුන්‍ය දැයි බැලීමෙන්, ශුන්‍ය අහෝසි වූ අරාවක් උපකල්පනය කිරීමයි. එසේ නොමැති නම්, අරාව සැලකිය යුතු ප්‍රමාණයකින් යුක්ත නම් එහි දිග ශුන්‍යයට සංසන්දනය කිරීම සම්පූර්ණයෙන්ම අකාර්යක්ෂම වේ. එසේම, සාමාන්‍යයෙන්, ඔබ හිස් අරාවක් සඳහා මතකය වෙන් නොකරනු ඇත (දර්ශකය ශුන්‍යව පවතී), එබැවින් එහි දිග ලබා ගැනීමට උත්සාහ කිරීම තේරුමක් නැත. ලෙන් (අ) == 0 එය කිරීමට හොඳ ක්‍රමයක් නොවන බව මම නොකියමි, එය දකින විට එය මට 'සී' කෑගසන්නේ නැත.
sleblanc

6
@BrennenSprimont, එය අහෝසි වී නොමැති නම්, දිග වෙනම විචල්‍යයක ගබඩා කර තිබේද, නැතහොත් ඔබේ අරාව දිග ලුහුබඳින යම් බහාලුමක ඔතා තිබේද යන්න ඔබ දැනටමත් දන්නවා. C ++, Java, C # එවැනි බහාලුම් ඇති අතර සමහර "දිග" ක්‍රමයක් කාර්යක්ෂමව ක්‍රියාත්මක කරයි. සීට එවැනි දෙයක් නැත , ඔබ ඔබේම රෝල් කළ යුතුය. ස්ථිතිකව වෙන් කරන ලද සී අරා යනු ඔබ ඉල්ලා ඇති දත්ත ප්‍රමාණය ගබඩා කිරීමට ප්‍රමාණවත් ඉඩක් ඇති බවට සහතික වී ඇති මතක අවකාශයකට යොමු කරන්නන් පමණි. සී තුළට කිසිවක් ගොඩනගා නැති අතර ඔබ දැනටමත් එම ඉඩ ප්‍රමාණය කොපමණ ප්‍රමාණයක් පුරවා ඇත්දැයි ඔබට දැනගත හැකිය.
sleblanc

1168

එය සිදු කිරීම සඳහා පයිතොනික් ක්‍රමය වන්නේ PEP 8 විලාසිතාවේ මාර්ගෝපදේශයෙනි ( ඔව් යන්නෙහි තේරුම “නිර්දේශිත” සහ “නිර්දේශ නොකෙරේ ” යන්නෙහි තේරුම නැත):

අනුක්‍රම සඳහා, (නූල්, ලැයිස්තු, ටුපල්), හිස් අනුක්‍රම අසත්‍යය යන කාරණය භාවිතා කරන්න.

Yes: if not seq:
     if seq:

No:  if len(seq):
     if not len(seq):

50
ලැයිස්තු ක්‍රමයක් seqවැනි වස්තුවක් යැයි අපේක්ෂා කරන සං signal ා කිරීමට ඔබට අවශ්‍ය නම් දෙවන ක්‍රමය වඩා හොඳ බව පෙනේ .
බෝල්පොයින්ට්බෙන්

5
@ බෝල්පොයින්ට්බෙන්, පයිතොනිම් උපදේශකයින් පවසන පරිදි, විචල්‍යය හැකිතාක් දුරට නම් කර ඇති ආකාරයට ගම්‍ය විය යුතුය
axolotl

9
AllBallpointBen විචල්‍යයක් විය යුත්තේ කුමක් දැයි සං aling ා කිරීම සඳහා පයිතන් වර්ගයේ ඉඟි භාවිතා කිරීමට උත්සාහ කරන්න . එය 3.5 දී හඳුන්වා දෙන ලදී.
බොරිස්

9
numpy විසින් මෙම මෝඩය බිඳ දැමීය ... seq = numpy.array ([1,2,3]) ඉන්පසු seq නොවේ නම් ව්‍යතිරේකයක් මතු කරයි "අගය දෝෂය: මූලද්‍රව්‍ය එකකට වඩා ඇති අරාවක සත්‍ය වටිනාකම අපැහැදිලි ය. a.any භාවිතා කරන්න () හෝ a.all () "
වෝර්ෂිප්මි

2
@jeronimo: එය lxml විශේෂිත අනතුරු ඇඟවීමක් බව මම විශ්වාස කරමි.
හාර්ලි හොල්කොම්බ්

772

මම එයට පැහැදිලිවම කැමතියි:

if len(li) == 0:
    print('the list is empty')

මේ ආකාරයෙන් එය 100% ක් පැහැදිලි liවන අතර එය අනුක්‍රමයක් (ලැයිස්තුවක්) වන අතර අපට එහි ප්‍රමාණය පරීක්ෂා කිරීමට අවශ්‍යය. මට ඇති ගැටළුව if not li: ...නම් එය liබූලියන් විචල්‍යයක් වන ව්‍යාජ හැඟීම ලබා දීමයි.


92
ලැයිස්තුවේ දිග ශුන්‍යයට සමාන දැයි පරීක්ෂා කිරීම, ලැයිස්තුව අසත්‍ය දැයි පරීක්ෂා කරනවාට වඩා, කැත සහ අශිෂ්ට ය. පයිතන් ගැන හුරුපුරුදු ඕනෑම අයෙක් කිසිසේත්ම liතෑග්ගක් යැයි නොසිතනු ඇත. එය වැදගත් නම්, ඔබ වැඩි කේතයක් නොව අදහස් දැක්වීමක් එක් කළ යුතුය.
කාල් ස්මිත්

21
මෙය අනවශ්‍ය ලෙස නිරවද්‍ය පරීක්‍ෂණයක් සේ පෙනේ, එය බොහෝ විට මන්දගාමී වන අතර සෑම විටම කියවිය නොහැකි IMHO වේ. කිසියම් දෙයක් හිස්ව තිබේදැයි පරීක්ෂා කරනවා වෙනුවට එය හිස් දැයි පරීක්ෂා නොකරන්නේ මන්ද?
ජෝන් බී

34
කෙසේ වෙතත්, මෙය නරක වීමට හේතුව (සහ පයිතන් වැනි ප්‍රබල මෝඩයන් සහිත භාෂාවක මෝඩයන් උල්ලං ting නය කිරීම පොදුවේ නරක ය) එය යම් හේතුවක් නිසා ඔබ විශේෂයෙන් දිග පරීක්ෂා කරන බව පා er කයාට සං als ා කිරීමයි (උදා: ඔබට අවශ්‍ය නිසා Noneහෝ 0සමත් වීමට වඩා ව්‍යතිරේකයක් මතු කිරීමට). ඒ නිසා, ඔබ නොමග යවමින්-සහ එම වෙනවා එය ඔබගේ කේතය විට එහි අර්ථය වන්නේ කිසිදු හේතුවක්, එය එසේ කරන විට කරන්නේ වෙනස කිරීමට අවශ්ය ඔබ සියලු මූලාශ්ර ඉතිරි පුරා "කෑගැසූ වෘකයා" තියෙනවා නිසා, වෙනසක් නොපෙනෙන.
abarnert

18
මම හිතන්නේ මෙය අනවශ්‍ය ලෙස කේතය දිගු කිරීම පමණයි. එසේ නොමැතිනම්, ඊටත් වඩා “පැහැදිලි” නොවන්නේ ඇයි if bool(len(li) == 0) is True:?
augurar

11
Ab ජබ්බා එය බොහෝ විට O (1) වනු ඇත ( ඔබ ගොඩනඟන ලද දත්ත වර්ග සමඟ වැඩ කරන අය), නමුත් ඔබට එය මත විශ්වාසය තැබිය නොහැක. ඔබ මෙම දේපල නොමැති අභිරුචි දත්ත වර්ගයක් සමඟ වැඩ කරනවා විය හැකිය. ඔබ දැනටමත් මෙම කේතය ලිවීමෙන් පසුව මෙම අභිරුචි දත්ත වර්ගය එක් කිරීමට තීරණය කළ හැකිය.
ralokt

326

මෙය "පයිතන් ටෙස්ට් හිස් අරාව" සහ ඒ හා සමාන විමසීම් සඳහා වන පළමු ගූගල් පහර වන අතර, අනෙක් අය ලැයිස්තුවෙන් ඔබ්බට ප්‍රශ්නය සාමාන්‍යකරණය කරන බවක් පෙනේ, එබැවින් මම සිතුවේ බොහෝ මිනිසුන්ගේ වෙනස් ආකාරයේ අනුක්‍රමයක් සඳහා අවවාදයක් එක් කිරීමටයි. භාවිතා කළ හැකිය.

NumPy අරා සඳහා වෙනත් ක්‍රම ක්‍රියා නොකරයි

ඔබ NumPy අරා සමඟ ප්‍රවේශම් විය යුතුය, මන්ද lists හෝ වෙනත් සම්මත බහාලුම් සඳහා හොඳින් ක්‍රියා කරන වෙනත් ක්‍රම NumPy අරා සඳහා අසමත් වේ. පහත හේතුව මම පැහැදිලි කරමි, නමුත් කෙටියෙන් කිවහොත් වඩාත් කැමති ක්‍රමය භාවිතා කිරීමයි size.

"පයිතොනික්" ක්‍රමය ක්‍රියා නොකරයි: 1 වන කොටස

"පයිතොනික්" මාර්ගය NumPy අරා සමඟ අසමත් වන්නේ NumPy විසින් අරාව bools කාණ්ඩයකට දැමීමට 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()

"පයිතොනික්" ක්‍රමය ක්‍රියා නොකරයි: 2 වන කොටස

නමුත් අවම වශයෙන් ඉහත නඩුව ඔබට පවසන්නේ එය අසාර්ථක වූ බවයි. ඔබට හරියටම එක් අංගයක් සහිත NumPy අරාවක් තිබේ නම්, එම ifප්‍රකාශය "ක්‍රියා කරයි", එයින් ඔබට දෝෂයක් නොලැබේ. කෙසේ වෙතත්, එම එක් අංගයක් 0(හෝ 0.0, හෝ False, ...) සිදුවුවහොත් , එම ifප්‍රකාශය වැරදි ලෙස ප්‍රති result ල වනු ඇත False:

>>> x = numpy.array([0,])
>>> if x: print("x")
... else: print("No x")
No x

නමුත් පැහැදිලිවම xපවතින අතර එය හිස් නොවේ! මෙම ප්‍රති result ලය ඔබට අවශ්‍ය දේ නොවේ.

භාවිතා lenකිරීමෙන් අනපේක්ෂිත ප්‍රති .ල ලබා ගත හැකිය

උදාහරණයක් වශයෙන්,

len( numpy.zeros((1,0)) )

අරාවෙහි ශුන්‍ය මූලද්‍රව්‍ය තිබුණද 1 නැවත ලබා දෙයි.

අංකිත ක්‍රමය

SciPy නිති අසන ප්‍රශ්නවල පැහැදිලි කර ඇති පරිදි , ඔබට NumPy අරාවක් ඇති බව ඔබ දන්නා සෑම අවස්ථාවකම නිවැරදි ක්‍රමය භාවිතා කිරීම 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

එය A list, NumPy අරාව හෝ වෙනත් දෙයක් විය හැකිදැයි ඔබට විශ්වාස නැත්නම්, ඔබට මෙම ප්‍රවේශය එක් එක් වර්ගය සඳහා නිවැරදි පරීක්ෂණය භාවිතා කරන බවට වග බලා ගැනීම සඳහා @dubiousjim ලබා දෙන පිළිතුර සමඟ ඒකාබද්ධ කළ හැකිය . එතරම් "පයිතොනික්" නොවේ, නමුත් NumPy හිතාමතාම අවම වශයෙන් මෙම අර්ථයෙන් පයිතොනික් භාවය බිඳ දැමූ බව පෙනේ.

ආදාන හිස් නම් ඔබ චෙක් වඩා වැඩි දෙයක් කිරීමට අවශ්ය, ඔබ වෙනත් NumPy භාවිතා කරන්නේ නම්, සූචිගත හෝ ගණිත මෙහෙයුම් වැනි ලක්ෂණ, එය ආදාන බල වඩාත් කාර්යක්ෂම (සහ නිසැකව වඩාත් පොදු), බොහෝ දුරට විය එය NumPy සාධක විය. මෙය ඉක්මණින් සිදු කිරීම සඳහා හොඳ කාර්යයන් කිහිපයක් තිබේ - වඩාත්ම වැදගත් දෙය numpy.asarray. මෙය ඔබගේ ආදානය ගනී, එය දැනටමත් අරාවක් නම් කිසිවක් නොකරයි, නැතහොත් එය ලැයිස්තුවක්, ටුපල් යනාදිය නම් ඔබේ ආදානය අරාවකට ඔතා, විකල්පයක් ලෙස ඔබ තෝරාගත් දේ බවට පරිවර්තනය කරයි dtype. එබැවින් එය විය හැකි සෑම විටම එය ඉතා ඉක්මන් වන අතර, එමඟින් ආදානය NumPy අරාව යැයි උපකල්පනය කිරීම සහතික කරයි. අරාවකට පරිවර්තනය කිරීමෙන් එය වර්තමාන විෂය පථයෙන් පරිබාහිර නොවන බැවින් අපි සාමාන්‍යයෙන් එකම නම පමණක් භාවිතා කරමු :

x = numpy.asarray(x, dtype=numpy.double)

අතර පත් කරනු x.sizeමම මේ පිටුවේ දකින සියලු අවස්ථාවල දී පරීක්ෂා වැඩ.


63
මෙය පයිතන් හි අඩුපාඩුවක් නොවන බව සඳහන් කිරීම වටී, ඒ වෙනුවට හිතාමතාම ගිවිසුමක් කඩ කිරීම numpy- numpyඉතා නිශ්චිත භාවිත නඩුවක් සහිත පුස්තකාලයක් වන අතර, එය අරාවෙහි සත්‍යතාව යනු කුමක්ද යන්නට වෙනස් 'ස්වාභාවික' අර්ථ දැක්වීමක් ඇත. බහාලුම් සඳහා පයිතන් ප්‍රමිතිය. ඒ වෙනුවට මාර්ග සංයුක්ත කිරීමට pathlibභාවිතා කරන ආකාරයට එම අවස්ථාව සඳහා ප්‍රශස්තිකරණය කිරීම අර්ථවත් කරයි - එය සම්මත නොවන නමුත් සන්දර්භය තුළ අර්ථවත් කරයි. /+
ගරෙත් ලැටි

9
එකඟ විය. මගේ අදහස නම්, ඉතා සුලභ if xහා මෝඩයන් සඳහා තාරාවන්ගේ යතුරු ලියනය කිරීම සඳහා තේරීමක් කර ඇති බව මතක තබා ගැනීම වැදගත් වන len(x)අතර සමහර විට එම බිඳවැටීම හඳුනා ගැනීමට සහ නිදොස්කරණය කිරීමට ඉතා අපහසු විය හැකිය.
මයික්

22
මම දන්නේ නැහැ, මට නම්, ලෙන් (x) නම් ක්‍රමයක් අරාවෙහි දිග ආපසු නොඑන්නේ නම් උපකල්පන නිසා එහි නම නරක ලෙස නිර්මාණය කර ඇත.
ඩෝල්ටන්

11
මෙම ප්‍රශ්නයට අංකිත අරා සමඟ කිසිදු සම්බන්ධයක් නැත
pppery

19
@ppperry ඔව්, මුල් ප්‍රශ්නය වූයේ නැම්පි අරා ගැන නොවේ, නමුත් එම හා තාරා ටයිප් කළ තර්ක සමඟ වැඩ කරන විට, මෙම ප්‍රශ්නය ඉතා අදාළ වේ.
පීටර්හිල්

227

ලැයිස්තුවක් හිස් දැයි පරීක්ෂා කිරීමට හොඳම ක්‍රමය

උදාහරණයක් ලෙස, පහත සඳහන් දෑ සම්මත වුවහොත්:

a = []

හිස් එකක් තිබේදැයි බැලීමට මා පරීක්ෂා කරන්නේ කෙසේද?

කෙටි පිළිතුර:

ලැයිස්තුව බූලියන් සන්දර්භයක තබන්න (නිදසුනක් ලෙස, ප්‍රකාශයක් ifහෝ whileප්‍රකාශයක් සමඟ). එය Falseහිස් දැයි පරීක්ෂා කරනු ඇත True. උදාහරණයක් වශයෙන්:

if not a:                           # do this!
    print('a is an empty list')

PEP 8

පයිතන්ගේ සම්මත පුස්තකාලයේ පයිතන් කේතය සඳහා නිල පයිතන් විලාසිතාවේ මාර්ගෝපදේශය වන පීඊපී 8 අවධාරනය කරයි:

අනුක්‍රම සඳහා, (නූල්, ලැයිස්තු, ටුපල්), හිස් අනුක්‍රම අසත්‍යය යන කාරණය භාවිතා කරන්න.

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)

සහ ඩේටමොඩෙල් ප්‍රලේඛනය:

object.__bool__(self)

සත්‍ය අගය පරීක්ෂා කිරීම සහ ගොඩනංවන ලද ක්‍රියාකාරිත්වය ක්‍රියාත්මක කිරීමට කැඳවනු ලැබේ bool(); ආපසු යා යුතුය Falseහෝ True. මෙම ක්‍රමය නිර්වචනය කර නොමැති විට __len__(), එය නිර්වචනය කර ඇත්නම් එය හැඳින්වේ, සහ එහි ප්‍රති result ලය අස්ථිර නම් වස්තුව සත්‍ය ලෙස සැලකේ. පංතියක් අර්ථ දක්වන්නේ __len__() නැතත් __bool__(), එහි සියලු අවස්ථා සත්‍ය ලෙස සැලකේ.

හා

object.__len__(self)

සාදන ලද කාර්යය ක්‍රියාත්මක කිරීමට කැඳවනු ලැබේ len(). වස්තුවක දිග, පූර්ණ සංඛ්‍යාවක්> = 0. ආපසු ලබා දිය යුතුය. එසේම, __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

අපි බලන්න එක්කෝ මෙම builtin ක්රියාකාරිත්වයට දිග සඳහා පරීක්ෂා කිරීම lenහා සසඳන 0 හෝ හිස් ලැයිස්තුව එරෙහිව පිරික්සුමක් බොහෝ ලේඛනගත ලෙස භාෂාව builtin කාරක රීති භාවිතා වඩා අඩු performant.

මන්ද?

සඳහා len(a) == 0 චෙක්:

පළමුවෙන්ම පයිතන්ට ග්ලෝබල් පරික්ෂා කර බැලීමට සිදුවේ len .

එවිට එය 0පයිතන්හි (C සමඟ වෙනුවට) ශ්‍රිතය, පැටවීම සහ සමානාත්මතාවය සැසඳිය යුතුය:

>>> 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

ඒ සඳහා [] == []එයට අනවශ්‍ය ලැයිස්තුවක් සෑදිය යුතු අතර, නැවතත්, පයිතන්ගේ අතථ්‍ය යන්ත්‍රයේ සංසන්දනාත්මක මෙහෙයුම කරන්න (C ට වඩා වෙනස්ව)

>>> 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

සී ප්‍රභවයෙන් සහ ප්‍රලේඛනයෙන් සාක්ෂි

PyVarObject

මෙය ක්ෂේත්‍රය PyObjectඑකතු කරන දිගුවකි ob_size. මෙය භාවිතා කරනුයේ දිග පිළිබඳ යම් අදහසක් ඇති වස්තූන් සඳහා පමණි. මෙම වර්ගය බොහෝ විට පයිතන් / සී API හි නොපෙන්වයි. එය PyObject_VAR_HEADසාර්ව ප්‍රසාරණය මගින් අර්ථ දක්වා ඇති ක්ෂේත්‍රයන්ට අනුරූප වේ .

ඇතුළත් කරන්න / listobject.h හි c ප්‍රභවයෙන් :

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) != 090.6 ns ± 8.3 ns, %timeit l != []55.6 ns ± 3.09, %timeit not not l38.5 ns ± 0.372 හා සසඳන විට හිස් නොවන නඩුව සඳහා ද මෙය සත්‍ය බව මම පෙන්වා දෙමි . නමුත් not not lතුන් ගුණයක වේගයක් තිබියදීත් කිසිවෙකු භුක්ති විඳීමට ක්‍රමයක් නොමැත . එය හාස්‍යජනක ලෙස පෙනේ. නමුත් වේගය ජය ගනී
යැයි සිතමි, ගැටලුව කාලානුරූපව පරික්ෂා කිරීම if l:ප්‍රමාණවත් බැවින් එය ප්‍රමාණවත් නමුත් පුදුම සහගත ලෙස %timeit bool(l)අස්වැන්න 101 ns ± 2.64 ns. සිත්ගන්නා කරුණ නම් මෙම ද .ුවම නොමැතිව බූල් කිරීමට බල කිරීමක් නැත. %timeit lපරිවර්තනයක් සිදු නොවන බැවින් නිෂ් less ල ය.

IPython magic, %timeitමෙහි සම්පූර්ණයෙන්ම නිෂ් less ල නොවේ:

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) != 090.6 ns ± 8.3 ns, %timeit l != []55.6 ns ± 3.09, %timeit not not l38.5 ns ± 0.372 හා සසඳන විට හිස් නොවන නඩුව සඳහාද මෙය සත්‍ය බව මම පෙන්වා දෙමි . නමුත් not not lතුන් ගුණයක වේගයක් තිබියදීත් කිසිවෙකු භුක්ති විඳීමට ක්‍රමයක් නොමැත . එය හාස්‍යජනක ලෙස පෙනේ. නමුත් වේගය ජය ගනී
ග්‍රෙගරි මෝර්ස්

මම හිතන්නේ ගැටලුව කාලානුරූපව පරීක්‍ෂා කිරීම if l:ප්‍රමාණවත් බැවින් එය පුදුම සහගත ලෙස %timeit bool(l)101 ns ± 2.64 ns. සිත්ගන්නා කරුණ නම් මෙම ද .ුවම නොමැතිව බූල් කිරීමට බල කිරීමක් නැත. %timeit lපරිවර්තනයක් සිදු නොවන බැවින් නිෂ් less ල ය.
ග්‍රෙගරි මෝර්ස්

139

සත්‍ය වටිනාකම් පරික්ෂා කිරීමේදී හිස් ලැයිස්තුවක් සාවද්‍ය යැයි සැලකේ ( පයිතන් ප්‍රලේඛනය බලන්න ):

a = []
if a:
     print "not empty"

@ ඩැරන් තෝමස්

සංස්කරණය කරන්න: හිස් ලැයිස්තුව වැරදි ලෙස පරීක්ෂා කිරීමට එරෙහි තවත් කරුණක්: බහුමාපකය ගැන කුමක් කිව හැකිද? ඔබ ලැයිස්තුවක් ලැයිස්තුවක් මත රඳා නොසිටිය යුතුය. එය තාරාවෙකු මෙන් විය යුතුය - මූලද්‍රව්‍යයන් නොමැති විට ඔබේ තාරාවන්ගේ එකතුව '' අසත්‍යය '' ඉවත් කිරීමට යන්නේ කෙසේද?

ඔබගේ duckCollection ක්රියාත්මක කළ යුතු __nonzero__හෝ __len__එසේ නම්, එවැනි: ප්රශ්නයක් නොමැතිව වැඩ කරනු ඇත.


අමුතු [] == Falseවුවත් තක්සේරු කරන්නේ කෙසේද යන්න පුදුම සහගතය
information_interchange

1
valueinformation_interchange ඔබට වටිනාකමේ සත්‍යතාව පැහැදිලිව පරීක්ෂා කිරීමට අවශ්‍ය නම් භාවිතා කරන්න bool(). අපේක්ෂිත පරිදි bool([]) == Falseඇගයීමට ලක් කරනු Trueඇත.
augurar

103

පැට්රික්ගේ (පිළිගත්) පිළිතුර හරි: if not a:එය කිරීමට නිවැරදි ක්‍රමයයි. හාර්ලි හොල්කොම්බ්ගේ පිළිතුර මෙය PEP 8 විලාසිතාවේ මාර්ගෝපදේශයේ ඇති බව නිවැරදිය. නමුත් කිසිම පිළිතුරක් පැහැදිලි නොකරන දෙය නම් මෝඩකම අනුගමනය කිරීම හොඳ අදහසක් - ඔබ පෞද්ගලිකව එය ප්‍රමාණවත් ලෙස හෝ රූබි පරිශීලකයින්ට හෝ වෙනත් දෙයකට ව්‍යාකූල නොවන බව සොයා ගත්තද.

පයිතන් කේතය සහ පයිතන් ප්‍රජාවට ඉතා ශක්තිමත් මෝඩයන් ඇත. එම මෝඩයන් අනුගමනය කිරීමෙන් ඔබේ කේතය පයිතන් හි අත්දැකීම් ඇති ඕනෑම කෙනෙකුට කියවීමට පහසු වේ. ඔබ එම මෝඩයන් උල්ලං When නය කරන විට එය ප්‍රබල සං .ාවකි.

එය සත්ය බව if not a:සිට හිස් ලැයිස්තු වෙනස හඳුනා නැත None, හෝ සංඛ්යා 0, හෝ හිස් tuples, හෝ හිස් පරිශීලක-නිර්මාණය එකතුව වර්ග, හෝ හිස් පරිශීලක-නිර්මාණය නොවන-තරමක්-එකතු වර්ග, හෝ තනි-අංගයක් NumPy මාලාවක් falsey සමග scalars ලෙස කටයුතු සාරධර්ම ආදිය. සමහර විට ඒ ගැන පැහැදිළි වීම වැදගත් ය. එවැනි අවස්ථාවක, ඔබට පැහැදිලි වීමට අවශ්‍ය දේ ඔබ දන්නවා , ඒ නිසා ඔබට ඒ සඳහා හරියටම පරීක්ෂා කළ හැකිය. නිදසුනක් ලෙස, if not a and a is not None:"කිසිවක් හැර අන් කිසිවක් වැරදියි" if len(a) != 0:යන්නෙහි තේරුම "හිස් අනුක්‍රමයන් පමණි" සහ අනුක්‍රමයක් හැර වෙනත් කිසිවක් මෙහි දෝෂයකි "සහ යනාදිය. ඔබට පරීක්ෂා කිරීමට අවශ්‍ය දේ හරියටම පරීක්ෂා කිරීමට අමතරව, මෙම පරීක්ෂණය වැදගත් බව පා er කයාට සං als ා කරයි.

නමුත් ඔබට පැහැදිලිව ප්‍රකාශ කිරීමට කිසිවක් නොමැති විට, හැර වෙනත් කිසිවක් පා if not a:er කයා නොමඟ යවයි. එය වැදගත් නොවන විට ඔබ සං sign ා කරයි. (ඔබ ද අඩු නම්යශීලී, හෝ මන්දගාමී, හෝ ඕනෑම දෙයක්, නමුත් එම සියළු අඩු වැදගත් වන්නේ, එම කේතය හැකි ය.) ඔබ නම් පුරුද්දක් ලෙස ඔබ පැමිණි විට, මේ වගේ පාඨකයා නොමග යැවීමට කළ වෙනසක් කිරීමට අවශ්ය, එය අවධානයට ලක් නිසා සම්මත කිරීමට යන්නේ ඔබ ඔබේ කේතය පුරාම "අ crying න වෘකයා" වී ඇත.


78

කිසිසේත් පරීක්ෂා කරන්නේ ඇයි?

ලැයිස්තුව මුලින්ම පරීක්ෂා කිරීමේ ඔබේ අවශ්‍යතාවය ප්‍රශ්න කිරීමට කිසිවෙකු ආමන්ත්‍රණය කර ඇති බවක් නොපෙනේ . ඔබ අමතර සන්දර්භයක් ලබා දී නැති නිසා, ඔබට මෙම පරීක්‍ෂණය මුලින් කිරීමට අවශ්‍ය නොවනු ඇතැයි මට සිතිය හැකිය, නමුත් පයිතන් හි ලැයිස්තු සැකසීම පිළිබඳව නුහුරු ය.

මම තර්ක කරන්නේ වඩාත්ම පයිතොනික් ක්‍රමය වන්නේ කිසිසේත් පරීක්ෂා නොකිරීම නොව ලැයිස්තුව සැකසීම බවයි. ඒ ආකාරයෙන් එය හිස් හෝ පිරී තිබුණත් නිවැරදි දේ කරනු ඇත.

a = []

for item in a:
    <do something with item>

<rest of code>

මේ කිසිවක් අඩංගු කටයුතු යහපත ඇති වන හිස්බව සඳහා නිශ්චිත චෙක්පත අවශ්ය නොවන අතර,. නම් වූ හිස්, යෑපෙන වාරණ ක්රියාත්මක නොවන අතර භාෂණ ඊළඟ රේඛාව හරහා වැටෙනු ඇත.

ඔබට ඇත්ත වශයෙන්ම හිස්බව සඳහා අරාව පරීක්ෂා කිරීමට අවශ්‍ය නම්, අනෙක් පිළිතුරු ප්‍රමාණවත් වේ.


3
කාරණය නම්, ලැයිස්තුව හිස් දැයි පරීක්ෂා කිරීම තරමක් වැදගත් ය, අවම වශයෙන් මට. ලූපයේ <rest of code>ප්‍රති result forලය භාවිතා කළ හැකි පිටපතක් තිබේදැයි ඔබ සලකා බැලුවද ? හෝ කෙලින්ම සමහර අගයන් භාවිතා aකරන්නේද? ඇත්ත වශයෙන්ම, ස්ක්‍රිප්ට් එක දැඩි ලෙස පාලනය කළ ආදානයකින් ක්‍රියාත්මක වන පරිදි නිර්මාණය කර ඇත්නම්, චෙක්පත ටිකක් අනවශ්‍ය විය හැකිය. නමුත් බොහෝ අවස්ථාවන්හීදී, ආදානය වෙනස් වන අතර චෙක්පතක් තිබීම වඩා හොඳය.
අමර්ත් ගොල්

ගෞරවනීය ලෙස, නැත. මා සලකා බැලුවේ පයිතන් ගැන ප්‍රමාණවත් දැනුමක් නැති අයෙකු “නම් <list>:” නිවැරදි පිළිතුර බව දැන ගැනීමට, හිස් ලැයිස්තුවක් පරීක්ෂා කරන්නේ කෙසේදැයි විමසීය. එවිට එකිනෙකට වෙනස් මත ඉදිරිපත් කරන පිළිතුරු රාශියක් මා දුටුවද කිසිවෙකු මුල් අවශ්‍යතාව සපුරාලන බවක් නොපෙනුණි. මගේ පිළිතුර සමඟ මා උත්සාහ කළේ එයයි. ඉදිරියට යාමට පෙර අවශ්‍යතාවය ඔවුන් විසින් පරීක්ෂා කර බලන්න. මගේ පිළිතුරට මම පැහැදිලිවම යෝජනා කළ බව මම විශ්වාස කරමි.
MrWonderful

@ AmarthGûl - එක් කෙසේද විය ලබා කම්බියක් සඳහා එහි තිර රචනය තුළ <code සෙසු> සිට ප්රතිඵල සකස් කිරීමට? ලැයිස්තුවක, සමහර විට? නැත්නම් සමහර විට නියෝගයක්ද? එසේ නම්, එකම තර්කනය අදාළ වේ. හිස් ලැයිස්තුවක් සැකසීම නරක අදහසක් වනු ඇති ඕනෑම ආකාරයක සාධාරණ ලෙස නිර්මාණය කරන ලද කේතයක් තුළ විචල්‍ය ආදානය කෙසේ බලපායිදැයි මට වැටහෙන්නේ නැත .
මිස්ටර් වොන්ඩර්ෆුල්

ටිකක් පරණ නමුත් ඔබ ලැයිස්තුව හිස් දැයි පරීක්ෂා කරන්නේ නම්, හිස් නොවන ලැයිස්තුවක් සඳහා OP හුදෙක් චෙක් මෙහෙයුමක් සොයන විට ඔබේ කේතය නැවත නැවතත් ක්‍රියාවලිය සිදු කරයි. N අනන්තය කරා ළඟා වන විට එම කේතය සඳහා වඩාත් නරක අවස්ථාවක් සිතන්න ....
DJK

7
JDJK - නෑ, මම හිතන්නේ ඔබට තවමත් එය මග හැරී ඇත. ඔබට ලැයිස්තුවක් තිබේ නම්, යමක් කිරීමට ඔබට අවශ්‍යය. එය හිස් නම් ඔබ වෙනස් ආකාරයකින් කරන්නේ කුමක්ද? වේලාසනින් ආපසු එනවාද? එය හිස් නොවේ නම් කුමක් කළ යුතුද? එය සකසනවාද? මෙම කරුණ ඔබට තවමත් වේ බොහෝ විට පමණක් අවංකව ඒ මත, හිස් ලැයිස්තුවක් සඳහා පරීක්ෂා කිරීම හා අවශ්ය නැත ඔබට කරන්න යන්නේ ඕනෑම දෙයක් කරන්න මූලද්රව්ය සමග. මූලද්රව්ය නොමැති නම්, ඔබ වැටේ. මූලද්රව්ය තිබේ නම්, ඔබට අවශ්ය පරිදි ඒවා සකස් කරන්න. කාරණය වන්නේ හිස් චෙක්පතක් සඳහා උදාහරණය භාවිතා කිරීම නොව, කිසිසේත් පරීක්ෂා නොකිරීම, ලැයිස්තුව සැකසීම පමණි.
MrWonderful

66

len()යනු පයිතන් ලැයිස්තු, නූල්, ඩික්ට්ස් සහ කට්ටල සඳහා O (1) මෙහෙයුමකි . පයිතන් අභ්‍යන්තරව මෙම බහාලුම්වල ඇති මූලද්‍රව්‍ය ගණන නිරීක්ෂණය කරයි.

ජාවාස්ක්‍රිප්ට්හි සත්‍ය / ව්‍යාජ පිළිබඳ සමාන අදහසක් ඇත .


40

මම ලියා තිබුණා:

if isinstance(a, (list, some, other, types, i, accept)) and not a:
    do_stuff

ඡන්දය දුන් -1. පා readers කයන් උපාය මාර්ගයට විරුද්ධ වූ නිසා හෝ ඉදිරිපත් කළ පරිදි පිළිතුර ප්‍රයෝජනවත් නොවේ යැයි සිතූ නිසාදැයි මට විශ්වාස නැත. --- “පයිතොනික්” ලෙස සලකන ඕනෑම දෙයක් --- මෙය නිවැරදි උපාය මාර්ගය බැවින් මම එය දෙවැන්න යැයි මවා පෙන්වන්නෙමි. ඔබ දැනටමත් බැහැර කර නොමැති නම් හෝ සිද්ධීන් හැසිරවීමට සුදානම් නොවන්නේ 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එය නිර්වචනය නොකළ අගයක් ඉල්ලා සිටියහොත් ). පොදුවේ ගත් කල, "පයිතොනික්" සම්මුතීන් මෙම අන්තිම මාර්ගයට යන බව පෙනේ. එය තාරාවෙකු මෙන් මිරිකා එය තාරා දෝෂයක් මතු කිරීමට ඉඩ දෙන්න. ඔබ තවමත් කුමන ආකාරයේ උපකල්පන සිදු කරන්නේද යන්න ගැන සිතා බැලිය යුතු අතර, නිසි ලෙස හැසිරවීමට ඔබ සූදානම් නැති අවස්ථා ඇත්ත වශයෙන්ම නිවැරදි ස්ථානවල වැරදි සිදුවන්නේද යන්න ගැන. නැම්පි අරා යනු අන්ධ ලෙස රඳා පවතින හොඳ උදාහරණයකිlen හෝ බූලියන් යතුරුලියනය ඔබ අපේක්ෂා කරන දේ හරියටම නොකරයි.


3
ඔබට පිළිගැනීමට අවශ්‍ය සහ වෙනත් වර්ග සඳහා නම්යශීලී නොවිය යුතු වර්ග 6 ක පරිපූර්ණ ලැයිස්තුවක් ඔබ සතුව තිබීම ඉතා කලාතුරකිනි. ඔබට එවැනි දෙයක් අවශ්‍ය වූ විට, ඔබට බොහෝ විට ඒබීසී අවශ්‍ය වේ. මෙම අවස්ථාවෙහිදී, එය බොහෝ විට ඒබීසී ඒබීසී වලින් එකක් collections.abc.Sizedහෝ collections.abc.Sequenceවිය හැකිය, නමුත් එය ඔබ විසින්ම ලියන එකක් විය හැකිය register(list). ඔබ සතුව වෙනත් කේත වලින් හිස් වෙන්කර හඳුනා ගැනීම වැදගත් වන කේතයක් තිබේ නම් සහ වෙනත් අනුක්‍රමයන්ගෙන් ලැයිස්තු සහ ටුපල් වෙන්කර හඳුනා ගැනීම වැදගත් නම්, මෙය නිවැරදියි - නමුත් ඔබට එවැනි කේතයක් ඇතැයි මම විශ්වාස නොකරමි.
abarnert

13
මිනිසුන් මෙයට අකමැති වීමට හේතුව එය බොහෝ අවස්ථාවන්හීදී මුළුමනින්ම අනවශ්‍ය නිසාය. පයිතන් යනු තාරා-ටයිප් කළ භාෂාවක් වන අතර, මෙම මට්ටමේ ආරක්ෂක කේතීකරණ එයට සක්‍රියව බාධා කරයි. පයිතන්ගේ වර්ගයේ පද්ධතිය පිටුපස ඇති අදහස නම්, වස්තුව අවශ්‍ය ආකාරයට ක්‍රියාත්මක වන තාක් කල් දේවල් ක්‍රියාත්මක විය යුතු බවයි. පැහැදිලි ආකාරයේ චෙක්පත් කිරීමෙන් ඔබ ඇමතුම්කරුට නිශ්චිත වර්ග භාවිතා කිරීමට බල කරයි, භාෂාවේ ධාන්ය වර්ගයට එරෙහිව ය. ඉඳහිට එවැනි දේ අත්‍යවශ්‍ය වන අතර (නූල් අනුපිළිවෙලක් ලෙස සැලකීමෙන් බැහැරව), එවැනි අවස්ථා දුර්ලභ වන අතර සෑම විටම පාහේ අසාදු ලේඛණ ලෙස හොඳම වේ.
ගරෙත් ලැටි

1
වටිනාකම හරියටම []වෙනත් වර්ගයක ව්‍යාජ දෙයක් නොවේදැයි පරීක්ෂා කර බැලීමට ඔබට අවශ්‍ය නම් , නියත වශයෙන්ම if a == []:ඉල්ලා සිටින්නේ, සමතුලිතතාවයෙන් මිදීමට වඩා.
RemcoGerlich

2
==කෙසේ වෙතත් ස්වයංක්‍රීය බලහත්කාරයන් කිහිපයක් තිබේ . මගේ හිස මුදුනේ සිට, මට කිසිවක් හඳුනාගත නොහැක []. [] == ()උදාහරණයක් ලෙස ප්‍රතිලාභ False. නමුත් උදාහරණයක් ලෙස frozenset()==set()ප්‍රතිලාභ True. එබැවින් අවම වශයෙන් කිසියම් නුසුදුසු වර්ගයක් සිදු කරන විට [](හෝ අනෙක් අතට) බල කළ හැකිද යන්න පිළිබඳව යම් අදහසක් ලබා දීම වටී a == [].
dubiousjim

EmRemcoGerlich - isinstance () තවමත් සැසඳීම සඳහා හිස් ලැයිස්තුවක් තැනීමට වඩා යෝග්‍ය වේ. එසේම, තවත් අයෙකු පෙන්වා දුන් පරිදි, සමානාත්මතා ක්‍රියාකරු සමහර වර්ගවල ව්‍යංග පරිවර්තනයක් ඉල්ලා සිටිය හැකි අතර එය නුසුදුසු විය හැකිය. "A == []" කේත කිරීමට කිසිඳු හේතුවක් නොමැති අතර, එම කේතය අනිවාර්යයෙන්ම මා සහභාගී වූ ඕනෑම කේත සමාලෝචනයේ අඩුපාඩුවක් ලෙස සලකුණු කරනු ඇත. භාෂාව සපයන පරිදි සුදුසු මෙවලමක් භාවිතා කිරීම "නොසලකා හැරීම" ලෙස නොසැලකිය යුතුය. , "ඒ වෙනුවට" හොඳ ක්‍රමලේඛන තාක්ෂණය. "
MrWonderful

29

සිට ප්රලේඛනය සත්යය අගය පරීක්ෂා කිරීම පිළිබඳ:

මෙහි ලැයිස්තුගත කර ඇති දේ හැර අනෙකුත් සියලුම අගයන් සලකා බලනු ලැබේ True

  • None
  • False
  • ඕනෑම සංඛ්යා වර්ගයේ ශුන්ය, උදාහරණයක් ලෙස, 0, 0.0, 0j.
  • ඕනෑම හිස් අනුක්රමය, උදාහරණයක් ලෙස, '', (), [].
  • ඕනෑම හිස් සිතියම්කරණයක්, උදාහරණයක් ලෙස {}.
  • පරිශීලක-නිර්වචනය කරන ලද පංතිවල අවස්ථා, පන්තිය a __bool__()හෝ __len__()ක්‍රමයක් නිර්වචනය කරන්නේ නම් , එම ක්‍රමය පූර්ණ සංඛ්‍යා ශුන්‍ය හෝ බූල් අගය ලබා දෙන විට False.

ලෙස දැකිය හැක, හිස් ලැයිස්තුවක් []වේ falsy , ඒ නිසා ශබ්ද වඩාත් කාර්යක්ෂම වූ වීජ අගය කිරීමට සිදු වන්නේ කුමක්ද කරන්නේ:

if not a:
    print('"a" is empty!')

TestDJ_Stuffy_K ඒකක ලැයිස්තුවේ හිස් ලැයිස්තුවක් කුමක්ද? භාවිතා කරන්න assert(not myList). ඔබට වස්තුව a බව තහවුරු කිරීමට අවශ්‍ය නම් list, ඔබට භාවිතා කළ හැකිය assertIsInstance().
Sнаđошƒаӽ

24

ලැයිස්තුවක් හිස් දැයි ඔබට පරීක්ෂා කළ හැකි ක්‍රම කිහිපයක් මෙන්න:

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")

21

මම පහත සඳහන් දේට කැමතියි:

if a == []:
   print "The list is empty."

37
ඔබ අනවශ්‍ය ලෙස අතිරේක හිස් ලැයිස්තුවක් ස්ථාපනය කරන බැවින් මෙය මන්දගාමී වනු ඇත.
කාල් මේයර්

32
මෙය කියවිය හැකි ප්‍රමාණයට වඩා අඩු වන අතර පහසුවෙන් if not a:කැඩී යයි. කරුණාකර එය නොකරන්න.
devsnd

කලින් කළ හොඳ කරුණක් () == []ද අසත්‍යයට සමාන ය. මෙම ක්‍රියාවට නැංවීම if not a:සියලු අවස්ථා ආවරණය කරන ආකාරය මා කැමති වුවද , ඔබ අනිවාර්යයෙන්ම ලැයිස්තුවක් අපේක්ෂා කරන්නේ නම් ඔබේ උදාහරණය ප්‍රමාණවත් විය යුතුය.
තරුවක්

19

ක්රමය 1 (කැමති):

if not a : 
   print ("Empty") 

ක්රමය 2:

if len(a) == 0 :
   print( "Empty" )

ක්රමය 3:

if a == [] :
  print ("Empty")

11
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-ness සඳහා පරීක්ෂණය වෙන් කිරීමට ඔබට අවශ්‍ය නැතිනම්, ඔබ එය කළ යුතු නැත.

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

8

බොහෝ පිළිතුරු ලබා දී ඇති අතර, ඒවායින් බොහොමයක් හොඳයි. මට අවශ්‍ය වූයේ එම චෙක්පත එක් කිරීමට ය

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 '...'
ස්වේන් ක්‍රෙගර්

4
Ven ස්වෙන්ක්‍රෙගර් නැත. ක්‍රියාකරු andපයිතන්හි කම්මැලි ය. andපෙර කොන්දේසිය andවැරදියි නම් පසුව කිසිවක් ක්‍රියාත්මක නොවේ .
එල්මෝවන්කියෙල්මෝ

7

අපට වෙනත් ආකාරයකින් සරල භාවිතා කළ හැකිය:

item_list=[]
if len(item_list) == 0:
    print("list is empty")
else:
    print("list is not empty")

5
-1 - ව්යාකූලත්වය වළක්වා ගැනීම සඳහා, විචල්ය නම් සඳහා වෙන් කර ඇති වචන භාවිතා නොකරන්න, නැතහොත් ඊළඟ වතාවේ ඔබ ඇමතීමට උත්සාහ කරන විට පුදුම සහගත හැසිරීමක් ඔබට ලැබෙනු ඇත, උදාහරණයක් ලෙස "list ()" ... "TypeError: 'list' වස්තුව වැනි දෙයක් අමතන්න බැහැ ”හෝ එවැනි සමහරක්.
MrWonderful

5

Ub ඩුබියස්ජිම්ගේ විසඳුමෙන් දේවානුභාවයෙන්, එය නැවත කළ හැකි දෙයක්ද යන්න පිළිබඳ අතිරේක පොදු පරීක්‍ෂණයක් භාවිතා කිරීමට මම යෝජනා කරමි

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

1
අක්වෙරළ; මෙය හුදෙක් ලැයිස්තුවක් හිස්ද, යමක් හිස් කළ හැකි දෙයක්ද යන්න විමසයි.
pppery

1
මා සතුටට පත් නොවන්නේ නම් if a:, එයට හේතුව aයම් ආකාරයක බහාලුමක් නොවේ නම් මට ව්‍යතිරේකයක් අවශ්‍ය වීමයි. (ක වීම iterable ද විමසිය හිස්බව සඳහා පරීක්ෂා කළ නොහැකි iterators, ඉඩ දෙයි.)
ඩේවිස් හුරුල්ලා


5

ලැයිස්තුවක් හිස් දැයි පරීක්ෂා කිරීමට ඔබට අවශ්‍ය නම්:

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.

1
සියල්ල (බූල් (x) x හි l සඳහා) හිස් ලැයිස්තුවක් සඳහා සත්‍ය වේ
gberger

4

Python3 සිට ඔබට භාවිතා කළ හැකිය

a == []

ලැයිස්තුව හිස් දැයි පරීක්ෂා කිරීමට

සංස්කරණය කරන්න: මෙය python2.7 සමඟද ක්‍රියා කරයි ..

මෙතරම් සංකීර්ණ පිළිතුරු ඇත්තේ මන්දැයි මට විශ්වාස නැත. එය ඉතා පැහැදිලිය


1
කරුණාකර "if" ලිවීමෙන් තොරව එය ක්‍රියා කරන ආකාරය ගැන වැඩි විස්තරයක් දෙන්න?
ගනේෂ්දේශ්මුක්

3
මෙය පයිතොනික් හෝ සම්පූර්ණ උදාහරණයක් නොවේ. එසේම, එය හමු වූ සෑම අවස්ථාවකම එය හිස් ලැයිස්තුවක් ස්ථාපනය කරයි. මෙය නොකරන්න.
MrWonderful

RMrWonderful එය සෑම විටම හිස් ලැයිස්තුවක් ස්ථාපනය නොකරයි. පවත්නා ලැයිස්තුව aහිස්ද නැද්ද යන්න එය සත්‍යාපනය කරයි .
ටෙසරැක්ටර්

RMrWonderful එය සෑදීමට හේතුව මට නොලැබේpythonic
Tessaracter

@ganeshdeshmukh ඔබ a==[]එය භාවිතා කරන්නේ නම් එය හිස් නම් පයිතන් පර්යන්තය මත සත්‍ය ලෙස මුද්‍රණය වේ. නැතහොත් එය වැරදි ලෙස මුද්‍රණය කරනු ඇත. ඔබට මෙය if කොන්දේසියක් ලෙස භාවිතා කළ හැකියif(a==[])
Tessaracter

3

ඔබට මේ වගේ bool () භාවිතා කිරීමට පවා උත්සාහ කළ හැකිය

    a = [1,2,3];
    print bool(a); # it will return True
    a = [];
    print bool(a); # it will return False

පිරික්සුම් ලැයිස්තුව හිස්ද නැද්ද යන්න මම මේ ආකාරයට කැමතියි.

ඉතා පහසු සහ ප්‍රයෝජනවත්.


4
(මා වැනි) නොදන්නා අය සඳහා, bool()පයිතන් විචල්‍යයක් බූලියන් බවට පරිවර්තනය කරයි , එවිට ඔබට ප්‍රකාශයක් භාවිතා නොකර වටිනාකමේ සත්‍යතාව හෝ ව්‍යාජත්වය ගබඩා කළ හැකිය . පිළිගත් පිළිතුර වැනි කොන්දේසියක් භාවිතා කරනවාට වඩා එය කියවිය නොහැකි යැයි මම සිතමි, නමුත් ඒ සඳහා වෙනත් හොඳ භාවිත අවස්ථා ඇති බව මට විශ්වාසයි.
ගැලන් ලෝන්ග්

මෙය ප්‍රකාශනයක භාවිතා කළ හැකි අතර වඩාත් දැඩි වේ.
qneill

3

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).


3
නමෙන් is_emptyඇඟවෙන්නේ එය යමක් ආපසු ලබා දෙන බවයි. එහෙත් එය අසාර්ථක නම්, ඒ දෙයක් පමණක් වනු ඇත bool(any_structure), ඔබ (ඒ වෙනුවට භාවිතා කළ යුතු වන විට ඔබට අවශ්ය boolසියලු දී).
ඩේවිස් හෙරින්ග්

4
boolසම්මත නිමැවුමට පණිවිඩ මුද්‍රණය කරන (ද) මත අපට වෙනසක් අවශ්‍ය ඇයි ?
ඩේවිස් හෙරින්ග්

Av ඩේවිස්හෙරින්ග් අපට සෑම විටම තේරීම් දෙකක් තිබේ, අනෙක් ශ්‍රිතය භාවිතයෙන් මුද්‍රණය කිරීම ප්‍රතිලාභ විචල්‍යයයි bool. තේරීම ඔබේ ය. මම දෙකම ලියන්නේ එවිට ඔබට ඒවා අතර තෝරා ගත හැකිය.
විනීත් ජේන්

3

සරල ක්‍රමය නම් දිග සමාන ශුන්‍යයක් දැයි පරීක්ෂා කිරීමයි.

if len(a) == 0:
    print("a is empty")


1

මා මෙහි ගෙන ආවේ විශේෂ භාවිත අවස්ථාවක්: මට ඇත්ත වශයෙන්ම අවශ්‍ය වූයේ ලැයිස්තුවක් හිස්ද නැද්ද යන්න මට පැවසීමට ශ්‍රිතයක් . මට අවශ්‍ය වූයේ මගේම ශ්‍රිතයක් ලිවීමෙන් හෝ මෙහි ලැම්බඩා ප්‍රකාශනයක් භාවිතා කිරීමෙන් වැළකී සිටීමටයි (මන්ද එය ප්‍රමාණවත් තරම් සරල විය යුතු බව පෙනෙන නිසා):

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හොඳම තේරීම වේ.


0

ලැයිස්තුවක් හිස්ද නැද්ද යන්න පරීක්ෂා කිරීමට ඔබට පහත ක්‍රම දෙකක් භාවිතා කළ හැකිය. නමුත් මතක තබා ගන්න, අපි යම් අනුක්‍රමයක් සඳහා පැහැදිලිව පරික්ෂා කිරීමේ ක්‍රමයෙන් වැළකී සිටිය යුතුය (එය 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"

මෙය උපකාරී වේ යැයි සිතමි.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.