2014-10-28 6 views
1

Скажем, у меня есть список в Python:Чистые вложенные списки в Python

l = [1, 2, 3, [a, [[9, 10, 11]], c, d], 5, [e, f, [6, 7, [8]]]] 

Я хотел бы, чтобы очистить все вложенные списки, так что, если они имеют длину 1 (только один пункт), то есть " подъехал»из списка, например, что пересмотренный список будет выглядеть следующим образом:

l = [1, 2, 3, [a, [9, 10, 11], c, d], 5, [e, f, [6, 7, 8]]] 

Естественно, я могу просто проверить, если len == 1 и заменить этот индекс с его содержанием, но ... есть встроенный способ сделать это?

+0

Существует нет встроенного для этого нет. –

+2

встроенный способ? Неа. Самое простое решение, вероятно, просто использовать рекурсивную функцию. – mgilson

+0

Предполагая, что вы уже используете рекурсию, кажется, вам следует просто продолжать делать метод, который вы делаете. –

ответ

2

Вы не могли бы использовать рекурсивную функцию:

def expand_singles(item): 
    if isinstance(item, list): 
     if len(item) == 1: 
      return expand_singles(item[0]) 
     return [expand_singles(i) for i in item] 
    return item 

Демо:

>>> def expand_singles(item): 
...  if isinstance(item, list): 
...   if len(item) == 1: 
...    return expand_singles(item[0]) 
...   return [expand_singles(i) for i in item] 
...  return item 
... 
>>> l = [1, 2, 3, ['a', [[9, 10, 11]], 'c', 'd'], 5, ['e', 'f', [6, 7, [8]]]] 
>>> expand_singles(l) 
[1, 2, 3, ['a', [9, 10, 11], 'c', 'd'], 5, ['e', 'f', [6, 7, 8]]] 
+0

Не работает для 'x = []; x [:] = [x, 'hello'] ' – wim

+0

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

Смежные вопросы