2013-11-23 21 views
0

我有任務要麼返回列表中的元素,如果它只有一個元素,或者返回列表本身。我使用的方法適用於大多數用例,但不適用於字符串。pythonic方法來查找列表的內部值

def inner_value(somelist): 
    ''' 
    Return somelist[0] if it's a one-element list or the whole list otherwise 

    :param list somelist: list that might contain only one element 
    :returns: element of somelist or somelist 

    >>> inner_value([42]) 
    42 
    >>> inner_value([42,43]) 
    [42, 43] 
    >>> inner_value([[42]]) 
    42 
    >>> inner_value([[42,43]]) 
    [42, 43] 
    >>> inner_value('spam') 
    'spam' 
    >>> inner_value(['spam']) 
    'spam' 
    >>> inner_value(['spam','eggs','bacon']) 
    ['spam', 'eggs', 'bacon'] 

    .. warning:: 
     This method does not work for dictionaries (KeyError) 
     or single character strings (infinite recursion)! 

    ''' 
    try: 
     if len(somelist) == 1: 
      return inner_value(somelist[0]) 
     else: 
      return somelist 
    except TypeError: 
     return somelist 

有沒有做這樣 inner_value('spam') == 'spam'的更好的辦法?

回答

1

你可以使用isinstance方法檢查變量類型:

if isinstance(somelist, list): 
    if len(somelist) == 1: 
     return somelist[0] 
    else: 
     return somelist 
else: 
    return somelist 

如果只檢查LEN,它會造成問題,因爲LEN將使字符串的大小太:

>>> len(['first','second','third']) 
3 
>>> len('arbitrary') 
9 
+0

啊!那很好。這也讓我對使用TypeError的try塊除外。我覺得嘗試/除了比類型測試更pythonic,但當然這使得它不那麼強大。有趣! – DrSAR

相關問題