5

私はpythonを試していますが、私がやっていることのコンテキストでエラーメッセージを理解しようとして立ち往生しています。

私は理解をいじっていて、複数の入力セットを持つリスト/辞書の理解を作成するパターンを見つけようとしています(これが可能であると仮定します):

注:ここで入力セットという単語は、内包表記の入力領域を意味します。setbuilder 表記法では、Python がその内包表記 [LIST の X の Y] を導出した場所から、Y は出力関数、X は変数、LIST は入力セットです。

次の作業コードがあるとします。

from random import randint

mydict = {k: 0 for k in range(10)}
result = {randint(0,9): v + 1 for v in mydict.values()}

それについて特別なことをしようとしているわけではありません。これは期待どおりに動作しないため、有用なコードではありません。ディクショナリ内のすべての要素の値は、ランダム ジェネレーターによって指定された要素だけではなく、1 になります。私の唯一の目的は、入力セットのタプルを使って作業を開始するための基礎を築くことです。

from random import randint

mydict = {k: 0 for k in range(10)}
result = {k: v + 1 for k, v in (randint(0,9), mydict.values())}

このオプションは私に与えます: TypeError: 'int' object is not iterable.

入力セットを交換して解凍すると、次のようになります。

result = {k: v + 1 for *v, k in (mydict.values(), randint(0,9))}

しかし、このオプションは私に与えます:TypeError: can only concatenate list (not "int") to list

これらのエラーは、言語の文法が理解できないことをしようとしているために表示されているのでしょうか、それともコードを修正できる何かが欠けているのでしょうか?

4

1 に答える 1

7

乱数については別の理解を作成する必要があります。現在のところ、乱数は 1 つしかありません。また、結合されたエンティティを取得するには、結果を圧縮する必要があります。

>>> from random import randint
>>> mydict = {k: 0 for k in range(10)}
>>> result = {k: v + 1 for k, v in zip([randint(0,9) for _ in range(10)] , mydict.values())}
>>> result
{2: 1, 3: 1, 4: 1, 5: 1, 8: 1, 9: 1}

最初の dict には0すべてのキーの値があるため、結果の dict のすべての値は1( 0+1) であることに注意してください。

また、キーをランダムに作成しているため、オーバーラップが発生する可能性があります (たとえば、2 回生成された)。そのため、ディクショナリ2にすべてのキーが表示されません。result

以下のコメントで @wim が指摘しているように、この結果ディクショナリを生成するより良い方法は、次を使用することです。

>>> {randint(0,9): v+1 for v in mydict.values()}
{0: 1, 1: 1, 2: 1, 3: 1, 6: 1, 7: 1}
于 2015-04-20T03:07:58.630 に答える