1

いくつかのレコードを辞書に追加しようとしています。

当初はこのようにしていました

licenses = [dict(licenseid=row[0], client=row[1], macaddress=row[2], void=row[18]) for row in db]

しかし、dbからレコードをフィルタリングするために何らかの処理を行う必要があることに気付いたので、コードを次のように変更してみました。

for rec in db:
    if rec['deleted'] == False:
       licenses.update(dict(licenseid=row[0], client=row[1], macaddress=row[2], void=row[18])

そのコードは例外なく実行されますが、ライセンスの最後のdbレコードになってしまうだけなので、混乱します。

4

5 に答える 5

1

私が正しく理解していれば、1つの辞書に複数のレコードを追加したいですよね?辞書のリストを作成する代わりに、リストの辞書を作成してみませんか?

  • 必要なキーのリストを作成することから始めます(常に同じ順序でキーにアクセスできるようにします)。

    keys = ["licenses", "client", "macaddress", "void"]
    
  • 空の辞書を作成します。

    licences = dict((k,[]) for k in keys]
    
  • 辞書にエントリを再帰的に追加します。

    for (k,item) in row:
        dict[k].append(item)
    

もちろん、最初にすべてのレコードのリストを作成してから、最後に辞書を作成する方が簡単な場合があります。

于 2012-08-17T09:10:03.243 に答える
1

licensesはリストだと思います:

licenses = []
...

そして、それに新しい辞書を追加する必要があります。

licenses.append(dict(...))
于 2012-08-17T08:49:49.487 に答える
1

dict.update ()ドキュメントを引用します。

update([other])他のキーと値のペアで辞書を更新し、既存のキーを上書きします。なしを返します。

これが、最後の更新が「勝つ」理由を説明しています。licencesリストの更新方法がないため、リストにすることはできません。

于 2012-08-17T09:17:27.163 に答える
0

投稿のコードが本物のコードである場合は、辞書を常に同じ値で更新する可能性があるため、最後の行(更新された行)の行をrecに置き換えることを検討してください。

編集:このコードには明らかに非常に間違ったものがあります。他の回答から、ライセンスがリストとして宣言されているという事実を見落としていることがわかります。したがって、例外がないことの唯一の説明は、表示するスニペットが本物ではないということです。または、すべてのレコードがrec ['deleted']がTrueになるようになっています(つまり、updateメソッドが呼び出されることはありません)。

于 2012-08-17T08:47:20.890 に答える
0

応答後、コードを修正しました。

licenses = []

for row in db:
        if row.deleted == False:
            licenses.append(dict(licenseid=row[0], client=row[1], macaddress=row[2], void=row[18]))

これで完全に機能します。私の愚かさを見つけてくれてありがとう!;)

于 2012-08-17T10:16:29.003 に答える