1

タプルのリストがあります:

lst = [('654', '2.12', '86'), ('2', '756'), ('5', '1.77', '71'), ('1.65', '55')]

関数

num = min(lst,key=lambda x: abs(float(x[1]) - 2))

各タプル内の位置の各数値を調べ、2に最も近いx[1]タプルを出力します。x[1]len == 3

もしそうなら、そのタプルと次の2項目のタプルを同時に出力したいのです。たとえば、上記の場合、最終結果は次のようになります。

[('654', '2.12', '86'), ('2', '756')]これで for ループで十分だと思うのでなんとかなると思います。

4

4 に答える 4

3

リストが常に 3 タプルと 2 タプルを交互に繰り返す場合は、次のように使用できます。

zip(*[iter(lst)]*2)

アイテムをペアにグループ化します。minその後、基本的に以前と同じように使用できます。

In [39]: min(zip(*[iter(lst)]*2),key=lambda (x,y): abs(float(x[1]) - 2))
Out[39]: (('654', '2.12', '86'), ('2', '756'))
于 2013-03-14T10:56:46.610 に答える
1

ジェネレータ式を使用してリストをフィルタリングできます。

num = min((t for t in list if len(t) == 3), key=lambda x: abs(float(x[1]) - 2))
于 2013-03-14T11:02:35.017 に答える
1

ラムダは式のみを保持できるため、条件式の使用に制限されます。

lambda x: abs(float(x[1]) - 2) if len(x) == 3 else float('inf')

ただし、それは 3 要素のタプルのみを返します。この関数は、シーケンス内の1 つのkey要素しか考慮できません。

3 要素のタプルの後に 2 要素のタプルが常にある場合は、それらをグループ化してから、それらのペアのタプルの中から最小値を決定する必要があります (unutbu の回答のように)。

于 2013-03-14T10:55:41.523 に答える
1

次のことができます。

num = min([el for el in lst if len(el)==3], key=lambda x: abs(float(x[1]) - 2))

そして、これは問題を強調しています。リストで異種データを使用しています。すべてのタプルが同じではない場合、それらはおそらく同じリストに属していません。

于 2013-03-14T11:06:07.630 に答える