1

私はpythonの初心者で、このようなリストを持っています

 [{'status': 1L, 'permalink': 'said', 'title': 'a', 'author': 'said', 'content': 'a', 'created_on': datetime.datetime(2013, 2, 10, 17, 46, 9), 'type': 1L, 'id': 1L}, 
{'status': 1L, 'permalink': 'said', 'title': 'hello', 'author': 'said', 'content': 'this is my first post', 'created_on': datetime.datetime(2013, 2, 10, 17, 48, 5), 'type': 2L, 'id': 2L}]

ID 1 の投稿を取得したいのですが、これを行うにはどうすればよいですか。for ループを使用する必要がありますか、それとも別の簡単な方法がありますか? Flask フレームワークを使用しています。

たとえば、このように url を呼び出して ID/editpost/1を取得した後、ID 1 の投稿を取得したいのですが、どうすればよいですか? また、なぜ 1 ではなく整数 1L なのですか? どうもありがとう。

4

3 に答える 3

2

1LPythonlong型です。それは通常の とまったく同じintです。python はそれを同じように扱い、区別は重要ではありません。

キーに一致する特定のアイテムを取得するにはnext()、ジェネレータ式で関数を使用します。

entryid = 1

try:
    match = next(s for s in inputlist if s['id'] == entryid)
except StopIteration:
    match = None  # not found

これにより、entryid に一致するキーを持つ最初のディクショナリが検索されます。そのようなアイテムがない場合は に設定されます。idmatchNone

于 2013-02-20T21:06:24.163 に答える
1

おそらくあなたのアプローチよりも簡単な2つの選択肢を試すことができます。

最初のものは「リスト内包表記」と呼ばれ、ほとんどの場合、オブジェクトを反復処理する最速の方法です (そして、私の意見では最良の方法です)。よくわかりませんが、リスト、タプル、辞書にも有効だと思います。したがって、次のように書くことができます。

// "posts" is the list of dictionaries you wrote in the question

my_post = [x for x in posts if x['id'] == 1L]

2 番目のオプションは、関数型プログラミングのアプローチを使用して、filter2 つの引数を持つ組み込み関数を Python で呼び出すことです。最初の引数はフィルターの条件を表す関数で (実際には、これはラムダ式と呼ばれます)、2 番目の引数は反復可能なオブジェクトです。

filter (lambda x : x['id'] == 1L, posts)

このように、「filter」関数は反復ごとに「posts」から要素を取得し、ラムダの引数として渡します。次に、現在の投稿の ID 値が 1L かどうかをチェックし、真の場合、投稿はフィルター処理され、ループの最後に返されます。

2番目のオプションが少し高度かどうかはわかりません。その場合は申し訳ありません。

それがあなたを助けることを願っています! :)

于 2013-02-20T22:35:55.823 に答える
1

Martijn Pieters がリスト内のデータを検索する方法の質問に答えていますが、質問に対する実際の答えは、データベースを使用してデータベースに ID を照会することです。コードとデータを混在させてはなりません。これこそまさにデータベースの目的です。

ただし、データベースを使用して投稿を保存したくないことが確実な場合は、ID で投稿をインデックス付けし、単に辞書をクエリする辞書を作成することをお勧めします。

#construct the dictionary
posts_by_id = {post["id"]: post for post in list_of_posts}

#now getting a post is as simple as this:
mypost = posts_by_id[theid]
于 2013-02-20T21:11:16.723 に答える