5

文字列内の ID の最小値を見つけて返したいとします。次に例を示します。

find_min_id([{"nonid": "-222", "id": 0}, {"id": -101}])
-101
find_min_id([{’id’: 63, 'id': 42}])
42

これまでのところ、私はこれを持っています:

def find_min_id(list):
    return min(list)

しかし、それは次のようになります:

{'id': -101}

最小のIDの値のみが必要です。

4

6 に答える 6

7

key次のパラメータを使用しますmin

def find_min_id(l):
    return min(l, key=lambda d: d.get("id", float('inf')))["id"]

これは実際に最小IDを見つけ、新しいリストを作成せずにそれを行います.

唯一のことは、リスト内の要素に'id'キーがない可能性があることです。そのため、使用する必要がありました.get("id", float('inf'))infしたがって、この関数はid キーがない場合に戻りますが、これは望ましくない可能性があります。空のリストを指定するとmin()例外がスローされるため、渡す辞書のいずれにもキーがない場合は、おそらく同じことを行いたいと思い'id'ます。その場合、ジェネレーターアプローチの最小値は実際により良いかもしれません:

def find_min_id(l):
    return min(d["id"] for d in l if "id" in d)

inf他のアプローチはの結果としてチェックすることですminが、これはより面倒です:

import math
def find_min_id(l):
    res = min(l, key=lambda d: d.get("id", float('inf')))["id"]
    if math.isinf(res):
        raise ValueError("No dict has an 'id' key")
    return res
于 2013-10-27T14:40:54.337 に答える
2

別のアプローチですがid、辞書にない場合、および辞書がまったくない場合に機能idします。

def find_min_id(lst):
    ids = [d['id'] for d in lst if 'id' in d]
    return min(ids) if ids else None

例外なく、min人為的に拡張されたリストを実行することもありません (つまり、エントリが id エントリではない場合に最大フロートを置く答え)。

于 2013-10-27T14:39:28.840 に答える
1
>>> ids = [{"nonid": "-222", "id": 0}, {"id": -101}]
>>> min([val for obj in ids for key, val in obj.items() if key == 'id'])
-101
>>> ids = [{'id': 63}, { 'id': 42}]
>>> min([val for obj in ids for key, val in obj.items() if key == 'id'])
42

上記を試してください。

これを関数定義にすることができます:

def find_lowest(ids):
    return min([val for obj in ids for key, val in obj.items() if key == 'id'])

実施

私が何をしているのか説明させてください。まず、min関数は反復可能なオブジェクトを引数として受け取ります。それでは、デモンストレーションしましょう:

>>> min([1,2,3,4,6,1,0])
0

つまり、これが意味することは、基本的に、これから取得するリストの最小値を取得していること[val for obj in ids for key, val in obj.items() if key == 'id']です。

さて、あなたは不思議に思うかもしれません、そこで何が起こっているのですか?最初は少し戸惑うかもしれませんが、これがリスト内包表記です。何て言う?簡単に言えば、リストを作成する簡潔な私たちです。

最初の部分から始めましょう。それはステートメントの始まりではありません。

for obj in ids

ここで行っているのは、 のすべての辞書オブジェクトを反復処理することですids。ここで、そのオブジェクトを使用します。

key, val in obj.items() if key == 'id'

object は であるため、この関数dictを使用してitems、キーと値のペアのタプルを提供するジェネレーターを取得します。このようなオブジェクト{'id': 100}では:idがキーに100なり、値になります。そのため、ディクショナリ オブジェクト内のすべての項目を調べて、たまたま が である場合は、それをリストに追加します。keyid

[val

それが最初の部分です。リスト内包表記の最初の部分は、最後のリストに何かvalを追加します。

アップデート:

何らかの理由で、リストにキーとして何も含まれていない場合、空のリストを受け入れないasidがスローされるため、これを修正するには、次のことを確認できます。ValueErrormin

def find_lowest(ids):
    _ret = [val for obj in ids for key, val in obj.items() if key == 'id']
    if _ret:
        return min(_ret)
    else:
        return None
于 2013-10-27T14:39:48.760 に答える
1

「最も低い」辞書を見つけようとしています。私たちが望むのは、'id'リスト内の最小値を見つけることです。

def find_min_id(lst):
    return min([d[key] for key in d for d in lst if key=="id"])

また、list変数名として使用しないでください。組み込み関数をオーバーライドしますlist()

ちょっとしたデモ:

>>> def find_min_id(lst):
    return min([d[key] for key in d for d in lst if key=="id"])

>>> find_min_id(lst)
-101

お役に立てれば!

于 2013-10-27T14:41:30.467 に答える
0

listは Python の組み込み型です。識別子として使用しないでください

def find_min_id(my_list)  
    id_list = []
    for record in my_list:
        if 'id' in record:
            id_list.append(record['id'])
    return min(id_list)
于 2013-10-27T14:54:35.307 に答える