如何判断列表中的元素本身是否为列表? [蟒蛇]

时间:2017-03-12 01:33:54

标签: python list

作为练习,我创建了一个代码,该代码以递归方式对列表中的元素进行求和,包括列表中的列表。

样本列表:a = [1,2,[3,4],[5,6]]

样本结果:21

我的代码如下:

a = [1,2,[3,4],[5,6]]

def sum(list):
    if len(list[0]) == 1 and len(list) ==1: # case where list is [x]
        return list[0]
    elif len(list[0]) == 1 and len(list) > 1: # case where list is [x, etc]
        return list[0] + sum(list[1:])
    elif len(list[0]) > 1 and len(list == 1): # case where list is [[x,etc]]
        return sum(list[0])
    else:                                     # case where list is [[x, etc], etc]
        return sum(list[0]) + sum(list[1:])

print (sum(a))

然而,当我尝试运行它时,我得到了错误"类型' int'没有长度。"我的印象是,如果list [0]本身不是一个列表,那么它只有1的长度,但很明显,这不起作用。我应该做些什么来检查列表中的元素本身是否为列表?

3 个答案:

答案 0 :(得分:3)

  

我应该做些什么来检查列表中的元素本身是否为列表?

if isinstance(x, list):

常见问题您不应将自己的变量命名为list,因为您会覆盖类型list和函数list()

同样适用于您的函数sum()。您不希望覆盖已处理数字列表的sum()函数。

或另一种方式是hasattr(lst, "__len__")

from numbers import Number

def recur_sum(lst):
  # Return single value immeadiately
  if not lst or lst is None:
    return 0
  if isinstance(lst, Number):
    return lst

  head = None 
  tail = False
  if hasattr(lst, "__len__"):
    _size = len(lst)
    if _size <= 0: # case where list is []
      head = 0
    elif _size >= 1:
      if hasattr(lst[0], "__len__"):  # case where list is [[x,etc]]
        head = recur_sum(lst[0]) 
      else: # case where list is [x]
        head = lst[0] 
    tail = (_size > 1)

  if not tail:
    return head 
  else: 
    return head + recur_sum(lst[1:])

答案 1 :(得分:2)

简而言之,您可以使用 isinstance 功能检查元素是否为列表。

下面的代码可以作为一个例子。

a = [1,2,[3,4],[5,6]]
a
Out[3]: 
[1, 2, [3, 4], [5, 6]]
isinstance(a,list)
Out[4]: 
True
isinstance(a[0],list)
Out[5]: 
False
isinstance(a[2],list)
Out[6]: 
True

答案 2 :(得分:0)

对于列表中的item,您可以将if条件更改为if type(item) is list:

a = [1,2,[3,4],[5,6]]
for item in a:
    if type(item) is list:
        # do_something_with(item)
        print(item)

,输出如下:

[3,4]
[5,6]

确保保留字list不会被覆盖为变量!