更多pythonic编写这种递归函数的方法

此函数用于获取通用字典(可能递归地包含其他字典和列表),并将其所有内容放在单个线性列表中.

def make_a_list(a):
  print type(a)
  if (type(a) == type({})):
    return make_a_list(a.keys()) + make_a_list(a.values())
  elif (type(a) == type([])):
    if len(a) > 1:
      return make_a_list(a[0]) + make_a_list(a[1:])
    return a
  else:
    return [a]

它完成了它的工作,但我想知道:
a)我忘记了任何重要的数据类型吗? (例如,我忘了套)
b)写一个更加pythonic的方式是什么? (尤其是我可以写一个列表理解吗?)

最佳答案 您可以使用yield避免函数中的列表创建/连接.

def make_a_list(a):
  if isinstance(a, dict):
    yield from make_a_list(a.keys())
    yield from make_a_list(a.values())
  elif isinstance(a, (list, tuple, set)):
    for x in a:
      yield from make_a_list(x)
  else:
    yield a

这是一个生成器,所以如果你真的需要一个列表,你可以这样做:

def make_a_real_list(a):
    return list(make_a_list(a))

另请注意isinstance比直接比较类型更好.

点赞