3

2 つのネストされたリストがあり、それぞれのネストされたリストには 2 つの文字列が含まれています。

list 1 [('EFG', '[3,4,5]'), ('DEF', '[2,3,4]')] and list 2 [('DEF', '[2,3,4]'), ('FGH', '[4,5,6]')]

2 つのリストを比較して、互いに同一のネストされたリストを復元したいと思います。この場合のみ('DEF','[2,3,4]')返却されます。リストが長くなる可能性があります。これを行う効率的な方法はありますか?

4

6 に答える 6

8

リストに文字列のタプルのみが含まれている場合、最も簡単な方法は集合の交差 (&) を使用することです。

>>> set([('EFG', '[3,4,5]'), ('DEF', '[2,3,4]')]) & set([('DEF', '[2,3,4]'), ('FGH', '[4,5,6]')])
set([('DEF', '[2,3,4]')])
于 2010-01-08T18:38:13.460 に答える
3

セットを使用してこれを行うのは非常に優れた実装ですが、最適なパフォーマンスを得るには、1 つのセットのみを使用する必要があります。

set1 = set([('EFG', '[3,4,5]'), ('DEF', '[2,3,4]')])
matches = [x for x in [('DEF', '[2,3,4]'), ('FGH', '[4,5,6]')] if x in set1]
于 2010-01-08T20:29:12.283 に答える
0

これが1つのアプローチです。リストをセットに変換し、それらの交点を見つけます。

>>> a,b = set([('EFG', '[3,4,5]'), ('DEF', '[2,3,4]')]), set([('DEF', '[2,3,4]'), ('FGH', '[4,5,6]')])
>>> print a.intersection(b)
set([('DEF', '[2,3,4]')])

リストの長さによってそれほど劣化するとは思いません。

于 2010-01-08T18:39:19.140 に答える
0
intersection = [item for item in list1 if item in list2]

ただし、何らかの理由でリストにミュータブルがあり、セットに変換できない場合にのみ使用してください。もちろん、リストのサイズと重複の数にもよりますが、10 倍遅くなる可能性があります。

于 2010-01-08T20:07:42.453 に答える
0

セット の組み込みサポートsetを使用するだけです

def get_set(list1,list2):
    s = set(list1)
    s &= set(list2)
    return s

そして、あなたの組合があります

于 2010-01-08T18:41:43.830 に答える
0
     python 3.2
     [i for i in list1 for v in list2 if i==v]
于 2012-12-12T18:11:45.983 に答える