0

以下のリストから特定のタプルを抽出するにはどうすればよいですか。

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

次のように、同じx軸でタプルを抽出したいと思います。

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

一方、(5,4)は破棄する必要があります。私を助けてください。
ありがとう

4

2 に答える 2

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)]
于 2013-02-23T07:13:27.163 に答える
0

前の質問と比較して、リストの深さを追加しました

したがって、このリスト内包表記は機能します。

>>> 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
于 2013-02-23T06:50:47.257 に答える