Преобразовать аргументы в плоский список? - PullRequest
2 голосов
/ 29 марта 2010

Я знаю, это очень похоже на несколько других вопросов, но я не могу заставить эту функцию работать правильно.

def flatten(*args):
    return list(item for iterable in args for item in iterable)

Вывод, который я ищу:

flatten(1) -> [1]
flatten(1,[2]) -> [1, 2]
flatten([1,[2]]) -> [1, 2]

Текущая функция, которую я взял из другого ответа SO, похоже, не дает правильных результатов вообще:

>>> flatten([1,[2]])
[1, [2]]

Ответы [ 4 ]

6 голосов
/ 29 марта 2010

Для быстрого решения просто возьмите вторую функцию и сделайте ее рекурсивной.

def flatten(*args):
    output = []
    for arg in args:
        if hasattr(arg, '__iter__'):
            output.extend(flatten(*arg))
        else:
            output.append(arg)
    return output
4 голосов
/ 29 марта 2010

Если вы хотите сгладить произвольно вложенные списки, вам нужна рекурсивная функция:

def flatten(ls):
  if isinstance(ls, list):
     return [fa for a in ls for fa in flatten(a)]
  else:
     return [ls]

(Если вы планируете выравнивать большие структуры, это можно сделать более эффективным, используя генераторы вместо возврата списков.)

Эту функцию также можно использовать повторно для создания функции, которая принимает несколько параметров:

def pflatten(*ls):
   return flatten(list(ls))
1 голос
/ 04 августа 2011

Проверка __ iter __ При сглаживании словаря присутствие может быть довольно странным:

>>> def flatten(*args):
...     output = []
...     for arg in args:
...         if hasattr(arg, '__iter__'):
...             output.extend(flatten(*arg))
...         else:
...             output.append(arg)
...     return output
...
>>> adict = {1:2, 3:4, 5:6}
>>> blist = ['a', 'b', 'c']
>>> raw = [adict, blist]
>>> flatten(raw)
[1, 3, 5, 'a', 'b', 'c']

Я думаю, что flatten должен работать только для списков и кортежей:

import types

def flatten(*args):
    output = []
    for arg in args:
        if isinstance(arg, (types.ListType, types.TupleType)):
            output.extend(flatten(*list(arg)))
        else:
            output.append(arg)
    return output

adict = {1:2, 3:4, 5:6}
blist = ['a', 'b', 'c']
raw = [adict, blist]
print flatten(raw)
0 голосов
/ 30 марта 2010

Решил это ...

def flatlist(*args):
    lst = []
    for a in args:
        if hasattr(a, '__iter__'): lst.extend(flatlist(*a))
        else: lst.append(a)
    return lst
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...