2013-02-23 41 views
0

我如何可以提取列表下面給出具體的元組:如何從Python列表中提取特定的元組?

[[[(1, 4)]], [[(1, 3)], [(5, 4)]], [[(1, 2)]]] 

我想提取具有相同的X軸的元組,如:

[(1,4), (1,3), (1,2)] 

,而(5,4)應被丟棄。 請幫幫我。
感謝

+0

你試過了什麼?如果你表明自己已經完成了一些工作(這是因爲其他人更有可能試圖幫助你,並且因爲它可以顯示你的情況的更多細節,所以你會更有可能得到有用的答案。 – Blckknght 2013-02-23 06:39:26

+1

這是不同於[你以前的問題](http://stackoverflow.com/q/15017497/78845)? – Johnsyweb 2013-02-23 06:41:40

+0

@ Johnsyweb:我是新來的蟒蛇!試圖做一個我的項目!我需要提取這些我的進一步計算值列表在列表中讓我很害怕 – 2013-02-23 06:46:14

回答

1

爲了展平的列表,你應該總是使用itertools.chain。在這種情況下,你必須套用嵌套chain來創建元組的平面列表

>>> l=[[[(1, 4)]], [[(1, 3)], [(5, 4)]], [[(1, 2)]]] 
>>> [e for e in chain(*chain(*l)) if e[0] == 1] 
[(1, 4), (1, 3), (1, 2)] 
+1

你應該實際使用'chain.from_iterable(l)'vs '鏈(* 1)'。更快。列表理解也比'chain(* l)'更快,但是'chain.from_iterable(l)'比LC更快。看時間。 – dawg 2013-02-23 18:10:18

0

那麼你添加相比,你previous question

所以,這個列表理解作品列表的附加深度:

>>> l=[[[(1, 4)]], [[(1, 3)], [(5, 4)]], [[(1, 2)]]] 
>>> def flat1(l): return [i for sub in l for i in sub] 
... 
>>> [t for t in flat1(flat1(l)) if t[0]==1] 
[(1, 4), (1, 3), (1, 2)] 

名單扁平列表的列表的理解方法如果大約與itertools.chain(*l)相同的速度(略快)。

如果你想使用itertools來提高速度,你應該使用chain.from_iterable(l)來代替。

這裏是時機:

import timeit 
n=1000000 

c1=''' 
def f1(l): 
    return [e for e in itertools.chain(*itertools.chain(*l)) if e[0] == 1] 

l1=f1([[[(1, 4)]], [[(1, 3)], [(5, 4)]], [[(1, 2)]]]) 
'''  

c2=''' 
def f2(l): 
    def flat1(l): return [i for sub in l for i in sub] 
    return [t for t in flat1(flat1(l)) if t[0]==1] 

l1=f2([[[(1, 4)]], [[(1, 3)], [(5, 4)]], [[(1, 2)]]]) 
''' 

c3=''' 
def f1(l): 
    flat1=itertools.chain.from_iterable 
    return [e for e in flat1(flat1(l)) if e[0] == 1] 

l1=f1([[[(1, 4)]], [[(1, 3)], [(5, 4)]], [[(1, 2)]]]) 
'''    

t1=timeit.timeit(stmt=c1,setup='import itertools',number=n) 
t2=timeit.timeit(stmt=c2,number=n) 
t3=timeit.timeit(stmt=c3,setup='import itertools',number=n) 

print '   chain(*l):',t1,'seconds' 
print ' list comprehension:',t2,'seconds' 
print 'chain.from_iterable:',t3,'seconds' 

打印:

  chain(*l): 4.32919406891 seconds 
list comprehension: 4.32601380348 seconds 
chain.from_iterable: 3.14966917038 seconds 
相關問題