2

私の辞書の簡略化:

my_dict = {
    'DOC': [
        [('k', 'v'), ('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3'), ('k4', 'v4')],
        [('k5', 'v5'), ('k', 'v'), ('k1', 'v1'), ('k6', 'v6')]
    ],
    'DIC': [
        [('k7', 'v7'), ('k3', 'v3'), ('k8', 'v8')],
        [('k5', 'v5'), ('k3', 'v3'), ('k1', 'v1'), ('k2', 'v2')],
        [('k4', 'v4'), ('k9', 'v9')]
    ],
    'INFRA': [
        [('k5', 'v5'), ('k3', 'v3'), ('k1', 'v1'), ('k2', 'v2')],
        [('k', 'v'), ('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3'), ('k4', 'v4')]
    ]
}

辞書の値を上書きする:

for k, v in my_dict.items():
     my_dict[k] = map(lambda x: dict(x), my_dict[k])

戻る...

my_dict 
{'DIC': [{'k3': 'v3', 'k7': 'v7', 'k8': 'v8'},
         {'k1': 'v1', 'k2': 'v2', 'k3': 'v3', 'k5': 'v5'},
         {'k4': 'v4', 'k9': 'v9'}],
 'DOC': [{'k': 'v', 'k1': 'v1', 'k2': 'v2', 'k3': 'v3', 'k4': 'v4'},
         {'k': 'v', 'k1': 'v1', 'k5': 'v5', 'k6': 'v6'}],
 'INFRA': [{'k1': 'v1', 'k2': 'v2', 'k3': 'v3', 'k5': 'v5'},
           {'k': 'v', 'k1': 'v1', 'k2': 'v2', 'k3': 'v3', 'k4': 'v4'}]}

同じロジックに従って実際のコードを実行すると、エラーが発生しました。

ValueError: 辞書更新シーケンス要素 #0 の長さは 6 です。2が必要です

を受け取るために別の辞書を作成しようとしましたmap()が、同じエラーが発生しました。誰かが私を助けることができますか?

4

5 に答える 5

4

実際のテストケースの入力は、期待する構造に準拠していません。特に、すべてがタプルである代わりに、要素の少なくとも 1 つが長さ 6 のシーケンスです。たとえば、誤った入力は次のようになります。

{'DOC': [
    [('123456')],               # A string is a sequence, too
    [('123' '456')]             # Note the lack of a comma
    [('1','2','3','4','5','6')] # A tuple, but with 6 elements
    [['1','2','3','4','5','6']] # A list
]}

この問題を解決するには、次のように入力を確認します。

for k, v in my_dict.items():
    for l in v:
        for subl in v:
            for tup in subl:
                if not len(tup) == 2:
                    raise ValueError('In %r: value is not a tuple(2), but %r'
                                     % (k, tup))

ところで、データ構造を設計するときは、以下を含むZen of Pythonに従うことをお勧めします。

フラットはネストよりも優れています。

于 2012-08-13T19:32:59.950 に答える
1

dictコンストラクターは、2 つの項目サブシーケンス (リストまたはタプル) のシーケンスを想定しています。サブシーケンスの少なくとも 1 つに 2 つ以上のアイテムが含まれています。

コンマが抜けている可能性があります (最後の項目を参照):

>>> dict([('1', 'red'),('2', 'blue'),('3' 'purple')]) # missing comma in last item
Traceback (most recent call last):
  File "<pyshell#166>", line 1, in <module>
    dict([('1', 'red'),('2', 'blue'),('3' 'purple')]) 
ValueError: dictionary update sequence element #2 has length 7; 2 is required

または、タプルの代わりに単一のアイテムを使用することもできます (最後のアイテムを参照してください)。

>>> dict([('1', 'red'),('2', 'blue'),('purple')]) # last "tuple" has one item
Traceback (most recent call last):
  File "<pyshell#167>", line 1, in <module>
    dict([('1', 'red'),('2', 'blue'),('purple')])
ValueError: dictionary update sequence element #2 has length 6; 2 is required
于 2012-08-13T19:35:30.063 に答える
0

あなたの質問のコードとデータに問題はありません。「実際の」コードに大きな違いがないと仮定すると、次のようなことを行って、エラーが発生する原因となっている不正なデータが何であるかを調べることができます。

def test(x):
    print x
    return dict(x)

for k, v in my_dict.items():
#     my_dict[k] = map(lambda x: dict(x), my_dict[k])
     my_dict[k] = map(test, my_dict[k])
于 2012-08-14T00:41:48.663 に答える
0

問題は、「実際のコード」では、リストの1つの最初の要素に2つ以上の要素があることです(6)。dictとして解釈するには、正確に 2 つ必要key, valueです。

あなたが説明したエラーを生成する例を次に示します。

my_dict = {
    'DOC': [
        [('k', 'v', 'extra1', 'extra2', 'extra3', 'extra4'), ('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3'), ('k4', 'v4')],
        [('k5', 'v5'), ('k', 'v'), ('k1', 'v1'), ('k6', 'v6')]
    ],
    'DIC': [
        [('k7', 'v7'), ('k3', 'v3'), ('k8', 'v8')],
        [('k5', 'v5'), ('k3', 'v3'), ('k1', 'v1'), ('k2', 'v2')],
        [('k4', 'v4'), ('k9', 'v9')]
    ],
    'INFRA': [
        [('k5', 'v5'), ('k3', 'v3'), ('k1', 'v1'), ('k2', 'v2')],
        [('k', 'v'), ('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3'), ('k4', 'v4')]
    ]
}

問題の要素を表示するために print ステートメントをドロップする簡単な方法を次に示します。

for k, v in my_dict.items():

    # Print out the first element of each list,
    # because one of them has six elements when it should only have two.
    for l in my_dict[k]:
        print l[0]

    my_dict[k] = map(lambda x: dict(x), my_dict[k])
于 2012-08-13T19:43:16.437 に答える
-1

あなたのコードよりも単純なこのコードはどうですか?

temp_dict = {}
for k in my_dict():
    temp_dict[k] = {}
    for t in my_dict[k]:
        temp_dict[k][t[0]] = t[1]
my_dict = temp_dec
del temp_dec
于 2012-08-13T19:37:50.217 に答える