0

私は辞書の 2 つのリストを持っています。1 つはプロジェクト ID のリストで、もう 1 つは完成したプロジェクト ID のリストです。完成したリストの存在に基づいて、プロジェクト識別子リストにキーを追加しようとしています。

現在のコード

>>> projects = [{'id': 1}, {'id': 2}, {'id': 3}]
>>> completes = [{'id': 1}, {'id': 2}]
>>> for complete in completes:
...     for project in projects:
...         if project["id"] == complete["id"]:
...             project["complete"] = 1
...         else:
...             project["complete"] = 0
...
>>> print projects
[{'id': 1, 'complete': 0}, {'id': 2, 'complete': 1}, {'id': 3, 'complete': 0}]

期待される出力

[{'id': 1, 'complete': 1}, {'id': 2, 'complete': 1}, {'id': 3, 'complete': 0}]

プロジェクトに完了のフラグが付けられたら、ネストされたループから抜け出すにはどうすればよいですか? ネストされたループを使用する代わりに、考慮すべき別のアプローチはありますか?

4

3 に答える 3

3

編集 - 修正済み (@sotapme に感謝)

次のようなものではないのはなぜですか:

cids = [c['id'] for c in completes]
for project in projects:
    project["complete"] = project["id"] in cids

これはまたはに設定project["complete"]されますが、どちらの方が良いと思います。とが本当に必要な場合は、次のようにします。TrueFalse10

    project["complete"] = int(project["id"] in cids)
于 2013-02-07T19:29:29.873 に答える
1

コメントはできませんが、ジムハークの言っていることは良いことです。

for project in projects:
    project['complete'] = project['id'] in (complete['id'] for complete in completes)

編集:彼はそれ以来、答えを正しいものに変更しました

于 2013-02-07T19:39:23.270 に答える
1

それらを id でキー付けされた dict の dict と dict の配列として保存すると、はるかに簡単になります (私の意見では):

projects = [{'id': 1}, {'id': 2}, {'id': 3}]
completes = [{'id': 1}, {'id': 2}]

projects_dict = {}
for p in projects:
    projects_dict[p['id']] = p

completes_dict = {}
for c in completes:
    completes_dict[c['id']] = c

for k in projects_dict.keys():
    projects_dict[k]['complete'] = int(k in completes_dict)

もちろん、完了をループする代わりに、辞書の「完了」配列を作成する場所に「完了」キーを追加するだけです。

于 2013-02-07T19:37:39.993 に答える