2014-03-07 36 views
0

有:進程列表到單獨列出

my_list = [([9, 1, 4], ['b', 'j', 'k']), ([8, 5, 9], ['m', 't', 'y']), ([6, 2, 0], ['p', 'q', 'r'])] 

想(按順序排列):

number_list = [9, 1, 4, 8, 5, 9, 6, 2, 0] 
letter_list = ['b', 'j', 'k', 'm', 't', 'y', 'p', 'q', 'r'] 

顯而易見的解決方案是:

for data in my_list: 

    try: 
     number_list += data[0] 
     letter_list += data[1] 
    except: 
     number_list = data[0] 
     letter_list = data[1] 

print number_list 
print letter_list 

> [9, 1, 4, 8, 5, 9, 6, 2, 0] 
> ['b', 'j', 'k', 'm', 't', 'y', 'p', 'q', 'r'] 

是否有更好和/或更快實現這一目標的方式 - 可能與列表理解?

+0

您的「顯而易見的」解決方案將更改'my_list'。當你寫'number_list = data [0]'時,你不會在'data [0]'中得到一個列表的副本,而只是一個引用。 – Matthias

+0

不知道。你如何得到一份清單的副本? –

+0

您可以使用'number_list = data [0] [:]'或使用['copy.copy'](http://docs.python.org/3/library/copy.html#copy)獲得副本。複製)或嵌套結構['copy.deepcopy'](http://docs.python.org/3/library/copy.html#copy.deepcopy)。 – Matthias

回答

6
>>> from itertools import chain 
>>> a, b = [list(chain.from_iterable(x)) for x in zip(*my_list)] 
>>> a 
[9, 1, 4, 8, 5, 9, 6, 2, 0] 
>>> b 
['b', 'j', 'k', 'm', 't', 'y', 'p', 'q', 'r'] 
+0

這很有效,直到有一天'my_list'爲空,並且你得到一個'ValueError:需要超過0個值才能解包'。 – user2357112

+0

使用try-except來解決這個問題。 – Matthias