2013-10-15 113 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

我認爲你的方式沒問題。這裏的另一種方式,使用遞歸,這將用於有關的任意深度嵌套的迭代結構工作:

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

相關問題