2

list1の要素がlist2に存在するか、共通している場合は、list1のタプルからタプルの新しいリストを作成したいと思います。

list1 = [('We', 'all'), ('all', 'live'), ('live', 'in'), ('in', 'a'),
         ('a', 'yellow'), ('yellow', 'submarine.')]

list2 = [('A', 'live'), ('live', 'yellow'), ('yellow', 'submarine'),
         ('submarine', 'lifeform'), ('lifeform', 'in'), ('in', 'a'),
         ('a', 'sea.')]

期待される出力=[('live', 'in'), ('in', 'a'), ('a', 'yellow')]

私のコードは以下のとおりです。この場合は機能しますが、大きなデータセットではどういうわけか失敗します。

All_elements_set1 = set([item for tuple in list1 for item in tuple])

All_elements_set2 = set([item for tuple in list2 for item in tuple])


common_set = All_elements_set1 & All_elements_set2

new_list = [(i,v) for i,v in list1 if i (in common_set and v in common_set)]

print new_list
4

2 に答える 2

3
In [39]: from itertools import chain

In [40]: list1 = [('We', 'all'), ('all', 'live'), ('live', 'in'), ('in', 'a'),
    ...:          ('a', 'yellow'), ('yellow', 'submarine.')]
    ...: 
    ...: list2 = [('A', 'live'), ('live', 'yellow'), ('yellow', 'submarine'),
    ...:          ('submarine', 'lifeform'), ('lifeform', 'in'), ('in', 'a'),
    ...:          ('a', 'sea.')]
    ...: 

In [41]: elems = set(chain.from_iterable(list2))

In [42]: [tup for tup in list1 if elems.issuperset(tup)]
Out[42]: [('live', 'in'), ('in', 'a'), ('a', 'yellow')]
于 2013-02-27T08:46:41.363 に答える
0

基本的に、list1 の要素のセットを作成する必要はありません。リスト1の各タプルについて、それらの要素がリスト2のタプルにあるかどうかを確認する場合に必要なのは...

list1 = [('We', 'all'), ('all', 'live'), ('live', 'in'), ('in', 'a'),
         ('a', 'yellow'), ('yellow', 'submarine.')]

list2 = [('A', 'live'), ('live', 'yellow'), ('yellow', 'submarine'),
         ('submarine', 'lifeform'), ('lifeform', 'in'), ('in', 'a'),
         ('a', 'sea.')]

Elements_set2 = set([item for tuple in list2 for item in tuple])

print [(i,v) for i,v in list1 if (i in Elements_set2 and v in Elements_set2 )]

コードが失敗した場合の詳細を提供していないため、これが失敗した例で機能するかどうかを確認できません。

于 2013-02-27T11:09:31.633 に答える