1. ホーム
  2. python

[解決済み] Key-Valueタプルのリストを辞書に変換するには?

2022-06-01 05:29:40

質問

次のようなリストがあります。

[('A', 1), ('B', 2), ('C', 3)]

みたいな辞書にしたいんです。

{'A': 1, 'B': 2, 'C': 3}

どうするのが一番いいのでしょうか?

EDIT: 私のタプルのリストは、実際にはもっと似ています。

[(A, 12937012397), (BERA, 2034927830), (CE, 2349057340)]

次のようなエラーが発生します。 ValueError: dictionary update sequence element #0 has length 1916; 2 is required

どのように解決するのですか?

あなたのエラー。

が表示される理由 ValueError: dictionary update sequence element #0 has length 1916; 2 is required エラーが発生します。

答えは、リストの要素があなたが思っているものと違うからです。もしあなたが myList[0] と入力すると、リストの最初の要素が2つのタプルでないことがわかります。 ('A', 1) のような2つのタプルではなく、1916の長さのイテレート可能なものであることがわかります。

一度、あなたが 実際に は、あなたが最初の質問で述べたような形式のリストを持っています ( myList = [('A',1),('B',2),...] )、あなたがすべきことは dict(myList) .


[2021年編集:今、特定のエラーについての意図された質問ではなく、実際に聞かれた質問にも答えています:] 。

一般的には

を使うか、通常の dict(iterableOrMapping) コンストラクタ を使用するか、または ディクショナリ {someExpr(k,v) for k:v in iterable} という構文になります。

>>> example1 = [('A',1), ('B',2), ('C',3)]
>>> dict(example1)
{'A': 1, 'B': 2, 'C': 3}

>>> {x:x**2 for x in range(3)}
{0: 0, 1: 1, 2:4}

# inline; same as example 1 effectively. may be an iterable, such as
# a sequence, evaluated generator, generator expression

>>> dict( zip(range(2),range(2)) )
{0: 0, 1: 1, 2:2}

A Python辞書 は、O(1)-search可能で順序のないペアのコレクション{( k ey→ v alue), ...}ここで、キーは任意のイミュータブルオブジェクト、値は任意のオブジェクトである。

キーは .__eq__() .__hash__() メソッドを辞書で使用できるようにします。もしこれを実装しようと考えているならば、おそらく何か間違ったことをしているので、別のマッピングデータ構造を検討すべきです! (キーを別のラッパー構造でラップして、通常のdictを使用することで回避できる場合もありますが、これは理想的ではないかもしれません)。

凍結型」または「不変型」、あるいはそれを装った型を実装したい中級または上級プログラマは、含意に非常に注意しなければならず、さもなければ、あなたのプログラムは 非常に微妙で見つけるのがほぼ不可能なバグが発生します。 :

オブジェクトを後で変異させ、その等質性の概念を変更することを許すなら、dict を使用することはできません。等しいと考えられるオブジェクトは、常に __eq__ が True を返し、かつ __hash__ は同じ値を返します。

メソッドは仕様に忠実に従わなければなりません。ということです。

  • 初心者のために ハッシュ関数( wikip. ) を使うと、偽陽性や真陽性を得ることができます。 hash(x)==hash(y) とは x MIGHT イコール y で、内部 Python コードがチェックするのは x==y ( .__eq__ ) を使って、それが偽陽性でなく真陽性であることを確認します。これにより、O(1)ルックアップが可能になります。
  • 初心者のために 非常に重要なのは __hash__ の値は、オブジェクトが最終的な状態になった後は、いかなる理由でも変更されないことが非常に重要です。 の両方を保証できない場合は hash(x)!=hash(y) implies x!=y の両方を保証できないのであれば、dictを使うべきではないでしょう。
  • を考えるかもしれません。 データ自体を変更するのではなく、別のタイプのマッピングを検討することもできます。 . これは、ライブラリを使用する代償として、ラッパーオブジェクトを書くことと同等になり得ます。これは通常必要ありません。
  • 専門家向けです。いくつかのデフォルトオブジェクトのハッシュは salt され、python の起動とバージョン間で変わる可能性があることにも注意すべきです (これは python のハッシュを含む何らかの方法でデータを保存したりネットワーク通信をする場合に困るかもしれません; それらはプロセスの起動ごとに再生成されるべき内部の詳細です)。

Pythonは以下のような組み込みの凍結されたデータ構造をたくさん持っています。 namedtuple , frozenset などがありますが、作業しにくいこともあります。 tuple は、基本的なフローズン・バリアントである list 構造体を格納できるようになります)。 {(1, 2): 3, (4, 5): 6} ). また、いくつかのバリエーションがあり dict 構造もあります。もし、"frozen dicts"から値へのマップを取得したい場合、frozendictはサードパーティのライブラリとしてしか存在しませんが、dictの .items() を、順序のない frozensettuple s.