0

次のように、数字をそれらの数字で終わる 100 未満の数字にマップする辞書を作成するとします。

d = {}
for i in range(100):
 r = i % 10
 if r in d:
  d[r] = d[r].append(i)
 else:
  d[r] = [i]
print d

まず、i が 20 のとき、d[r] に追加しようとすると、明らかに NoneType であり、エラーがスローされます。これはなぜでしょうか?第二に、r in d をチェックする作業が伝播されないため、私のアプローチは非効率的であると感じています。このようなものが良いでしょう、私は感じます:

case(d[r]) of 
   SOME(L) => d[r] = L.append(i)
 | NONE => d[r] = [i]

そのロジックをPythonで使用する方法はありますか?

4

2 に答える 2

1

まず、i が 20 のとき、d[r] に追加しようとすると、明らかに NoneType であり、エラーがスローされます。これはなぜでしょうか?

これは、次のコードが間違っているためです。

d[r] = d[r].append(i)

.append副作用としてリストを変更し、 を返しますNone。したがって、リストが追加された後、リストは破棄され、None現在再割り当てされている値に置き換えられd[r]ます。

そのロジックをPythonで使用する方法はありますか?

使用できるさまざまなハックがありますが、ここではどれも適切ではありません。

代わりに、「存在する場合は辞書の値を変更するか、そうでない場合は新しい値を作成する」という特定の問題を解決してください。これは、「存在しない場合は空のデフォルト値を作成し、存在することが保証されている値を変更する」に絞り込むことができます。

を使用してそれを行うことができます.setdefault。または、よりエレガントに、辞書を次のように置き換えることができますcollections.defaultdict

from collections import defaultdict

d = defaultdict(list)
for i in range(100):
    r = i % 10
    d[r].append(i)

または、さらに具体的な問題を解決することもできます: 「指定されたパターンで辞書を作成する」、つまり、規則または式を入力シーケンスに適用することから (この場合、入力は次のようになりますrange(100):

from itertools import groupby

def last_digit(i): return i % 10
d = {k: list(v) for k, v in groupby(sorted(range(100), key=last_digit), last_digit)}

rangeまたは、別の引数を使用してステップ サイズを指定するという事実を利用して、さらに具体的な問題を解決することもできます。

d = {i: range(i, 100, 10) for i in range(10)}
于 2012-05-18T05:19:23.237 に答える
0

を使用するアンドリューの提案によりd[r].append(i)、望ましい答えが得られます。

In [3]: d
Out[3]: 
{0: [0, 10, 20, 30, 40, 50, 60, 70, 80, 90],
 1: [1, 11, 21, 31, 41, 51, 61, 71, 81, 91],
 2: [2, 12, 22, 32, 42, 52, 62, 72, 82, 92],
 3: [3, 13, 23, 33, 43, 53, 63, 73, 83, 93],
 4: [4, 14, 24, 34, 44, 54, 64, 74, 84, 94],
 5: [5, 15, 25, 35, 45, 55, 65, 75, 85, 95],
 6: [6, 16, 26, 36, 46, 56, 66, 76, 86, 96],
 7: [7, 17, 27, 37, 47, 57, 67, 77, 87, 97],
 8: [8, 18, 28, 38, 48, 58, 68, 78, 88, 98],
 9: [9, 19, 29, 39, 49, 59, 69, 79, 89, 99]}

あなたはこれを行うことができます:

In [7]: for onesdigit in range(10):
   ...:     d[onesdigit] = range(onesdigit, 100, 10)
于 2012-05-18T05:19:52.290 に答える