2012-08-13 81 views
1

我的字典的簡化:如何覆蓋python字典值?

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: dictionary update sequence element #0 has length 6; 2 is required

我試着創建另一個字典來接收map(),但發生了同樣的錯誤。有人可以幫助我嗎?

+2

你的代碼對我來說運行良好。你可以顯示一個導致「ValueError」的例子嗎? – 2012-08-13 19:31:21

+1

真的很難找到你看不到的代碼中的錯誤。':(' – 2012-08-13 19:32:19

+1

Aside:'{k:map(dict,v)for k,v in my_dict.iteritems()}'有點簡單(2.7;'.items()'3)。'lambda'是不必要的,即使你提取它也不使用'v' – DSM 2012-08-13 19:42:55

回答

1

dict CONSTRU ctor需要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 
+0

非常有趣的例子,但我檢查了我的元組,並沒有注意到沒有逗號或一個單詞。我有(u'vesti \ xe1rio',None)之類的東西,但它運行在ipython上。 – 2012-08-13 20:53:54

+1

@ user1596206:您可能沒有注意到問題,但存在問題。 Python的錯誤信息是說實話。嘗試運行phihag爲您寫的診斷。我認爲這會讓你看不見的錯誤可見。 – 2012-08-13 21:17:06

+1

@ Steven Rumbalski:錯誤信息真的在說實話。 phihag提出的代碼對我非常有用,返回ValueError:在'DOCENTE'中:value不是元組(2),而是u'quadro'。所以,我可以檢測到我之前發生的錯誤,並且它與覆蓋python字典值無關。非常感謝你,如果問題沒有解決,我很抱歉。 – 2012-08-13 23:16:09

4

實際測試用例中的輸入不符合您期望的結構。特別地,而不是全部爲元組,所述元件中的至少一個是長度爲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,其中包括:

Flat is better than nested.

+0

我已經使用了建議的代碼,但在我的真正元組中沒有6個元素的序列。 – 2012-08-13 20:12:18

+0

你能簡化你真正的元組,直到你得到一個可以顯示給我們的輸入,但仍然失敗嗎? – phihag 2012-08-13 20:21:03

+1

@ user1596206:你可能在你的一個元組中丟失了逗號嗎?如果你忘記了逗號,'('18','blue')'成爲一個單一的六個字符串,因爲Python隱式地連接了兩個相鄰的字符串。 – 2012-08-13 20:29:21

-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 
+0

-1這隻會掩蓋問題。而錯誤的數據通常比錯誤更糟糕。 – phihag 2012-08-13 20:17:13

0

問題是,在你的「真實代碼」中,你的列表中的第一個元素s有兩個以上的元素(6)。 dict正好需要兩個才能將它們解釋爲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')] 
    ] 
} 

這裏有一個簡單的方法,在打印語句刪除,看問題的元素:

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]) 
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])