2012-12-02 36 views
2

我有一個字符串和元組列表。元組是這樣的(數字,元素):我需要從Python中的元組打印/返回多個元素

s = ["element1", (3, "element2"), (2, "element3")] 

我需要的元組將被打印這樣的:

element1 
element2 
element2 
element2 
element3 
element3 

即,我需要數*元件打印。我想出了最好的是這樣的:

s = ["element1", (3, "element2"), (2, "element3")] 

def bb (x): 
    for n in x: 
     if isinstance (n, str): 
      print (n) 
     if isinstance (n, tuple): 
      print (n[1]) 

回答

-1

這裏是一個班輪:

s = ["element1", (3, "element2"), (2, "element3")] 
result = sum(([x] if type(x) != tuple else x[0]*[x[1]] for x in s), []) 

或擴展現有的代碼:

def bb(x): 
    for n in x: 
     if isinstance(n, str): 
      print(n) 
     elif isinstance(n, tuple): 
      count, value = n 
      for i in range(count): 
       print(value) 

如果你想返回這些值,您可能需要使用發電機:

def bb_gen(x): 
    for n in x: 
     if isinstance(n, str): 
      yield n 
     elif isinstance(n, tuple): 
      count, value = n 
      for i in range(count): 
       yield value 

for value in bb_gen(s): 
    print value 
+0

-1,'type(x)== y''是鍵入檢查的可怕方法。 –

+0

@Lattyware:不是所有情況。如果你在那裏有一個'namedtuple'(被用作一個類)? – Eric

+0

有可能從我已有的東西中做點什麼嗎?我正在努力從朋友那裏獲得一些uni任務,我嘗試學習他們的步調,做他們必須做的事情,因爲它可能具有教學目的... – user1871015

2

Ide盟友,改變你的輸入,所以你得到[(1, "element1,"), ...],但如果這是不可能的:

import types 
import itertools 

s = ["element1", (3, "element2"), (2, "element3")] 

print(list(itertools.chain.from_iterable((e,) if isinstance(e, str) else itertools.repeat(e[1], e[0]) for e in s))) 

給我們:

['element1', 'element2', 'element2', 'element2', 'element3', 'element3'] 

我們這裏做的是把你的元素,使之成爲元組,如果字符串(所以它們不會被迭代到字符中),並且使用itertools.repeat()來創建一個迭代器,如果它們是元組,它們將重複它們的次數。然後我們使用itertools.chain.from_iterable()將這個集合集合平鋪到一個迭代器中,然後我們將它變成一個列表。

在2.x中注意,你想要isinstance(e, basestring)

編輯:或者:

args = ((e, 1) if isinstance(e, str) else (e[1], e[0]) for e in s) 
itertools.chain.from_iterable(itertools.starmap(itertools.repeat, args)) 

這是同樣的事情,但也許在我看來有點整潔。

+0

'types.StringType'和'basestring'之間有什麼區別? – Eric

+1

@Eric:'basestring'是'str'和'unicode'('types.StringType'和'types.UnicodeType')的父類。 –

+0

在2.x中,你想使用'isinstance(e,basestring)'也許?而'isinstance(e,str)'也可以。 –

相關問題