2012-06-25 18 views
6

इस सरल समारोह पर विचार होते हैं शामिल नहीं हैअजगर किसी भी मूल्य

def foo(l=[]): 
    if not l: print "List is empty" 
    else : print "List is not empty" 

अब foo

x=[] 
foo(x) 
#List is empty 

foo('') 
#List is empty 

फोन लेकिन एक्स = [ ''] सूची के रूप में नहीं माना जाता है, तो चलो खाली !!!

x=[''] 
foo(x) 
#List is not empty 

प्रश्न -

  1. क्यों खाली मानों की सूची खाली के रूप में नहीं माना जाता है? (चर के मामले में यह खाली जैसे के रूप में माना जाता है)

    x='' 
    if x:print 'not empty!!' 
    else: print 'empty' 
    
  2. ताकि सूची इन सभी मामलों में खाली के रूप में विचार किया जाएगा कैसे मैं समारोह foo() को संशोधित कर सकते हैं: x=[], x=[''], x=['', '']

+0

नोट- मैं के मामले में समझ में एक्स = [ ''] सूची सही मायने में नहीं है खाली लेकिन फिर भी आप जानते हैं कि यह खाली है :) (या इसमें मूल्य/डेटा नहीं है जिसका उपयोग किया जा सकता है) –

+4

आप ** वास्तव में ** क्या करने की कोशिश कर रहे हैं? आप ** ** ['', '' '] को "खाली" क्यों मानना ​​चाहते हैं? –

+0

['', ''] बड़ी समस्या नहीं है .... इस सेट के लिए (['', '']) का उपयोग किया जा सकता है !! –

उत्तर

13

का उपयोग में निर्मित any()

def foo(l=[]): 
    if any(l): 
     print 'List is not empty' 
    else: 
     print 'List is empty' 

foo(['']) 
# List is empty 
+2

ध्यान दें कि यह '[[' ']] 'के लिए" असफल "होगा। हालांकि, मुझे यकीन नहीं है कि ओपी क्या कर रहा है वैसे भी बुद्धिमान है। अधिक महत्वपूर्ण बात यह है कि यह '[झूठी] 'के लिए विफल रहता है। – Eric

+0

एरिक पर दोनों गिनती पर सच है। –

2

अपने उदाहरण में, केवल इस मामले में जहां सूची वास्तव में है खाली वह है जिसमें स्क्वायर ब्रैकेट में कुछ भी नहीं है। अन्य उदाहरणों में आपके पास खाली तारों की विभिन्न संख्याओं के साथ सूचियां हैं। ये बस अलग हैं (और सभी भाषाओं में मैं सोच सकता हूं, वही सच होगा)।

0

सूची ['] वास्तव में खाली नहीं है। इसमें एक खाली स्ट्रिंग है। स्ट्रिंग खाली है, सूची नहीं है। यदि आप इन सूचियों को ढूंढना चाहते हैं, तो जांचें कि सूची खाली है या नहीं, और यदि नहीं, तो जांचें कि प्रत्येक प्रविष्टि '' है या नहीं।

1

सबसे पहले: यहां तक ​​कि एक खाली स्ट्रिंग एक स्ट्रिंग है। एक सूची जिसमें एक खाली स्ट्रिंग है अभी भी एक तत्व है।

जबकि a='' लेन = 0 के साथ खाली है, यह सूची के लिए परवाह किए बिना, यह अभी भी होता है एक तत्व है, जैसे, mylist = [a]mylist = [''] रूप में ही है, लेकिन यह आप के लिए स्पष्ट हो सकता है। एक तत्व के रूप में a लें और सामग्री को अनदेखा करें।

यह जांचने के लिए कि सूची के तत्व खाली हैं या नहीं, उन पर पुनरावृत्त करें।

def isEmpty(li=[]): 
    for elem in li: 
    if len(elem) > 0: return false 
    return true 
+0

मुझे लगता है कि आपके पास गलत तर्क है। यदि आप 'len> 0' पर वापस आते हैं, तो बाद में' l' पर पुनरावृत्ति करने में कोई बात नहीं है। – glglgl

+0

@gigigi: आप पूरी तरह से सही हैं, मैंने इसे ठीक किया है। लेकिन कोई भी काम करेगा। – tuergeist

1

आप नेस्टेड सूचियों से निपटने के लिए समारोह foo के लिए पुनरावर्ती कॉल उपयोग कर सकते हैं।

def foo(l=[]): 
    if type(l)==list: 
     return any([foo(x) for x in l]) 
    else: 
     return bool(l) 
1

क्यों खाली मानों की सूची खाली नहीं माना जाता है के बारे में अपने पहले सवाल का जवाब करने के लिए, क्योंकि यह कुछ शामिल करता है, भले ही उन चीजों के लिए खुद को खाली हैं बस। इसके बारे में खाली बक्से के एक बॉक्स की तरह सोचो।

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

इसके अलावा, आपने यह नहीं कहा कि यह क्या करना चाहिए यदि यह पारित किया गया तर्क किसी भी प्रकार की सूची नहीं है या सूची थी, लेकिन इसमें केवल अन्य सूचियां या तार नहीं थे, इसलिए लिखा गया है कि यह एक उठाएगा TypeError अपवाद - कुछ ऐसा जो कि अधिकांश अंतर्निहित पायथन कार्यों के समान होता है जब यह उनके साथ होता है।

try: 
    string_type = basestring 
except NameError: # probably Python 3.x 
    string_type = str 

class _NULL(object): # unique marker object 
    def __repr__(self): return '<nothing>' 
_NULL = _NULL() 

def empty_list(arg=_NULL): 
    arg = arg if arg is not _NULL else [] 
    if not isinstance(arg, (list, string_type)): 
     raise TypeError 
    elif isinstance(arg, string_type): 
     return not len(arg) 
    else: 
     return len(arg) == 0 or all(empty_list(e) for e in arg) 

def foo(list_=None): 
    if list_ is None or empty_list(list_): 
     print 'list is empty' 
    else: 
     print 'list is not empty' 

testcases = [ 
    _NULL, 
    [], 
    [''], 
    ['', ''], 
    ['', ['']], 
    ['abc'], 
    ['', 'abc'], 
    [False], 
    [None], 
    [0], 
    [0.0], 
    [0L], 
    [0j], 
    [42], 
    [{}], 
    [{'':0}], 
    [{'a':1}], 
    False, 
    None, 
    0, 
    0.0, 
    0L, 
    0j, 
    42, 
    {}, 
    {'':0}, 
    {'a':1}, 
] 

for arg in testcases: 
    call = 'foo({!r:s}) ->'.format(arg) 
    print '{!s:>20s}'.format(call), 
    try: 
     foo() if arg is _NULL else foo(arg) 
    except TypeError: 
     print 'illegal argument exception' 

यहाँ उत्पादन यह अजगर 2.7 के साथ पैदा करता है: नीचे नमूना कोड और इसके परीक्षण उत्पादन है

foo(<nothing>) -> list is empty 
     foo([]) -> list is empty 
     foo(['']) -> list is empty 
    foo(['', '']) -> list is empty 
foo(['', ['']]) -> list is empty 
    foo(['abc']) -> list is not empty 
foo(['', 'abc']) -> list is not empty 
    foo([False]) -> illegal argument exception 
    foo([None]) -> illegal argument exception 
     foo([0]) -> illegal argument exception 
    foo([0.0]) -> illegal argument exception 
     foo([0L]) -> illegal argument exception 
     foo([0j]) -> illegal argument exception 
     foo([42]) -> illegal argument exception 
     foo([{}]) -> illegal argument exception 
foo([{'': 0}]) -> illegal argument exception 
foo([{'a': 1}]) -> illegal argument exception 
    foo(False) -> illegal argument exception 
     foo(None) -> list is empty 
     foo(0) -> illegal argument exception 
     foo(0.0) -> illegal argument exception 
     foo(0L) -> illegal argument exception 
     foo(0j) -> illegal argument exception 
     foo(42) -> illegal argument exception 
     foo({}) -> illegal argument exception 
    foo({'': 0}) -> illegal argument exception 
    foo({'a': 1}) -> illegal argument exception 
संबंधित मुद्दे