6

これが私が探していることです。タプルのリストが2つあります。list1のタプルの最初の要素がリスト2のタプルの最初の要素と一致するように、要素のリストを作成します。

list1 = [('a', 2), ('b', 3), ('z', 5)]

list2 = [('a', 1), ('b', 2), ('c', 3)]

list3 = ['a','b']

注:最初の要素が重複することはありません

Pythonリスト内包表記を見た後、これは私がやったことです

[x[0] for x in list1 if (x[0] in [y[0] for y in list2])]

私の質問は、これは経験豊富なPythonプログラマーがこれをどのようにコーディングするかということです。これを自分でコーディングした後でも、これはかなり読みにくいと思います。そうでなければ、他にどのようにそれをしますか

4

4 に答える 4

9

私は使用しますzip()

In [25]: l1 = [('a', 2), ('b', 3), ('z', 5)]

In [26]: l2 = [('a', 1), ('b', 2), ('c', 3)]

In [27]: [x[0] for x,y in zip(l1,l2) if x[0]==y[0]]
Out[27]: ['a', 'b']

編集:上記のコメントを読んだ後、あなたはこのようなものを探しているようです:

In [36]: [x[0] for x in l1 if any(x[0]==y[0] for y in l2)]
Out[36]: ['a', 'b']

または使用sets

In [43]: from operator import itemgetter

In [44]: set(map(itemgetter(0),l1)) & set(map(itemgetter(0),l2))
Out[44]: set(['a', 'b'])
于 2012-10-31T22:18:30.840 に答える
3

ここで sを使用したいと思いますset

set(x[0] for x in list1).intersection(y[0] for y in list2)

またはシンタックスシュガーを使用:

{x[0] for x in list1} & {y[0] for y in list2}

どちらも次の結果になります。

set(['a', 'b'])
于 2012-10-31T22:26:46.747 に答える
2

ここでセットを使用する方がおそらく明確だと思います(重複する要素がないため):

set1 = set( el[0] for el in list1 )
set2 = set( el[0] for el in list2 )
set3 = set1 & set2 # set intersection
# list3 = list(set3)
于 2012-10-31T22:27:51.167 に答える
1

タプルの最初の要素の積集合が必要であると仮定すると、Python 2.7 で導入されたディクショナリ キー ビューを使用できます。

dict(list1).viewkeys() & dict(list2).viewkeys()

これは、線形ランタイム (ソリューションの O(mn) とは対照的に) を備えているため、長いリストのソリューションよりもはるかに効率的ですが、(によって定義された順序とは対照的に) 任意の順序で結果を返しますlist1

Python 3.x では、これは次のようになります。

dict(list1).keys() & dict(list2).keys()
于 2012-10-31T22:30:31.340 に答える