2016-04-19 5 views
1

Есть ли простой способ в python (используя itertools или иначе) для преобразования вложенного итерабельного f в соответствующий список или кортеж? Я хотел бы сохранить f, поэтому я могу перебирать его несколько раз, а это значит, что если некоторые вложенные элементы f являются генераторами, у меня будут проблемы.Преобразование вложенных итераций в список

Я приведу пример ввода/вывода.

>>> g = iter(range(2)) 
>>> my_input = [1, [2, 3], ((4), 5), [6, g]] 
>>> magical_function(my_input) 
[1, [2, 3], [[4], 5], [6, [0, 1]]] 

Было бы хорошо, если бы результат состоял из кортежей. Проблема в том, что итерация по g «потребляет» ее, поэтому ее нельзя использовать снова.

+1

Что вы подразумеваете под «соответствующим списком» вложенного итерабельного? Вы хотите сгладить итерабельность? Если это так, вы хотите одноуровневое выравнивание, выравнивание n-уровня или рекурсивное сглаживание? – user2357112

+0

Я не хочу сглаживания. Под «соответствующим списком» я подразумеваю, что хочу сохранить вложенную структуру '' f''. –

+1

Можете ли вы представить пример кода, что вы пытались и что вы хотите получить от этого? – Nilesh

ответ

2

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

import collections 

g = iter(range(2)) 
my_input = [1, [2, 3], ((4), 5), [6, g]] 

def unfold(iterable): 
    ret = [] 
    for element in iterable: 
     if isinstance(element, collections.Iterable): 
      ret.append(unfold(element)) 
     else: 
      ret.append(element) 
    return ret 

n = unfold(my_input) 
print(n) 
print(n) 

который возвращает

$ python3 so.py 
[1, [2, 3], [4, 5], [6, [0, 1]]] 
[1, [2, 3], [4, 5], [6, [0, 1]]] 

Это не самый красивый способ, и вы можете найти способы улучшить его (он ставит все в вместо сохранения кортежей), но вот общая идея, которую я бы использовал.

+0

Отлично, это делает именно то, что я хочу! Мне было интересно, было ли что-то подобное уже реализовано в itertools (я всегда узнаю об этих вещах задолго до того, как захочу), но если нет, я всегда могу использовать этот код. –

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