2013-10-15 3 views
2

У меня есть кортеж, который состоит из некоторого набора целых чисел и некоторых целых чисел, например ((1, 2), 3, (4, 5), 6). Теперь мне нужны все целые числа. Я написал:Все элементы из кортежа в Python

def get_all_items(iterable): 
    t = [] 

    for each in iterable: 
     if type(each) == int: 
      t.append(each) 
     else: 
      t.extend(each) 

    return tuple(t) 

Это работает для меня. Есть ли лучший способ сделать это?

+1

Вы знаете наверняка, что есть только на e уровня иерархии, т. е. у вас нет кортежей кортежей кортежей? –

+0

@KyleStrand Да –

ответ

1
from itertools import chain 

def flatten(items): 
    def renest(): 
    for item in items: 
     try: 
     yield iter(item) 
     except TypeError: 
     yield iter([item]) 
    return list(chain.from_iterable(renest())) 
+0

@ DSM да, я забыл, что 'itertools' не был волшебным. – kojiro

+0

Легко забыть, потому что это так часто бывает. : ^) – DSM

1

Я думаю, что ваш путь в порядке. Вот еще один способ, с помощью рекурсии, которая будет работать на произвольно глубоко вложенной Iterable структуры:

def get_all_items(iterable): 
    try: 
     result = [] 
     for element in iterable: 
      result += detuple(element) 
     return result 
    except TypeError: 
     return [iterable] 

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

1
import itertools 
itertools.chain.from_iterable(
    item if hasattr(item, '__iter__') else (item,) 
     for item in iterable 
) 
1

Вы можете упростить ваш код этой

def get_all_items(iterable): 
    t = [] 
    for each in iterable: 
     t.extend(list(each) if isinstance(each, tuple) else [each]) 
    return tuple(t) 

print get_all_items(((1, 2), 3, (4, 5), 6)) 

Выход

(1, 2, 3, 4, 5, 6) 
3

Не забудьте читы путь

>>> from ast import literal_eval 
>>> t = ((1, 2), 3, (4, 5), 6) 
>>> literal_eval(repr(t).translate(None, '()')) 
(1, 2, 3, 4, 5, 6) 
+0

Это не часто этот код заставляет меня смеяться ... Я думаю, что меня достало - это «способ обмана», – SethMMorton

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