5

最初の2つの要素が同じで、3番目の要素を無視する場合にのみ、ネストされたリストから重複を削除しようとしています。

リスト:

L = [['el1','el2','value1'], ['el3','el4','value2'], ['el1','el2','value2'], ['el1','el5','value3']]

戻ります:

L = [['el3','el4','value2'], ['el1','el2','value2'], ['el1','el5','value3']]

私はここで同様のことをする簡単な方法を見つけました:

dict((x[0], x) for x in L).values()

しかし、これは最初の要素に対してのみ機能し、最初の2に対しては機能しませんが、それ以外の場合はまさにそれが必要です。

4

3 に答える 3

4

順序が重要でない場合は、同じ方法を使用できますが、キーとして1番目と2番目の要素のタプルを使用します。

{(x[0], x[1]): x for x in L}.values()

または、2.7より前のPythonバージョンの場合:

dict(((x[0], x[1]), x) for x in L).values()

(x[0], x[1])を使用する代わりに、tuple(x[:2])読みやすい方を使用してください。

于 2012-10-15T19:52:00.313 に答える
4

順序が重要な場合setは、ネストされたリストの最初の2つの要素のみでを使用します。

seen = set()
seen_add = seen.add
return [x for x in seq if tuple(x[:2]) not in seen and not seen_add(tuple(x[:2]))]

collections.OrderedDict()または、オブジェクトを使用して順序を維持することもできます。x[:2]スライスをキーとして(タプルとして)保持し、値を抽出します。

from collections import OrderedDict(

return OrderedDict((tuple(x[:2]), x) for x in seq).values()

Python 3.6以降では、標準のdictタイプも挿入順序を保持します。

return list({tuple(x[:2]): x for x in seq}.values())

list()ディクショナリビューオブジェクトをリストに変換するには、この呼び出しが必要です。

于 2012-10-15T19:53:25.053 に答える
2

これはそれを行う必要があります:

In [55]: dict((tuple(x[:2]), x) for x in L).values()
Out[55]: [['el1', 'el2', 'value2'], ['el1', 'el5', 'value3'], ['el3', 'el4', 'value2']]
于 2012-10-15T19:53:11.107 に答える