-1

私は最近、条件を満たす 2 つのリスト間の違いの取得に関して質問しましたが、単一のリスト内のアイテムに対して同じことを行うために、以下の例示的なラムダ式を変更することに失敗し続けています。

A = ['12', '15', '20', '30']

filter(lambda a: all([abs(int(a) - int(b)) >= 5 for b in List1]), List2)

私のリストがソートされ、さまざまな長さを持つことができる場所。目標は、上記の式を変更して、リスト内の他のアイテムとの差が 5 以下のアイテムのみを取得することです。

上記のリストで動作する出力は次の場所にあります。

newAList = ['12', '15', '20']
4

2 に答える 2

0

あなたのコメントに基づいて、次のリスト内包表記があなたが探していることを行うはずだと思います。主な部分は次のとおりです。

  • anyの代わりに使用しallて、現在見ているアイテムより最大で 5 小さいか大きいアイテムが存在するかどうかを確認します。
  • enumerate条件が現在見ているアイテムを確実に無視するようにするために使用します-重複がないことがわかっている場合は、への呼び出しを削除しenumerateて比較を変更できます0 < abs(int(a) - int(b)) <= 5
  • 私の意見では、読みやすくする代わりにリスト内包表記を使用します(単に)-ただしfilter、 で同じことを行うことができるはずですfilter

コード:

>>> A = ['12', '15', '20', '30']
>>> [a for i, a in enumerate(A) if any(j != i and abs(int(a) - int(b)) <= 5 for j, b in enumerate(A))]
['12', '15', '20']

ただし、リスト内のすべての項目に対して 1 回リストを反復処理するため、これよりもはるかに大きなリストの場合、これは非常に非効率的です。ただし、出発点を示すには十分であることを願っています。

于 2013-07-14T17:12:04.753 に答える