考慮以下幾點:的Python:複製重複字典到列表 - 最後一個字典項上當受騙到所有列表項
import re
sequence = 'FFFFFF{7}FFFFFF'
patterns = [ ('([0-9a-fA-F]+)', 'Sequence'),
('(\\([0-9a-fA-F]+\\|[0-9a-fA-F]+\\))', 'Option'),
('({[0-9a-fA-F]+})', 'Range'),
('(\\[[0-9a-fA-F]+:([0-9a-fA-F]+|\*)\\])', 'Slice'),
('(\\?\\?)+', 'Byte_value_Wildcard'),
('(\\*)+', 'Byte_length_wildcard') ]
fragment_counter = 0
fragment_dict= {}
fragments_list = []
while sequence:
found = False
for pattern, name in patterns:
m = re.match (pattern,sequence)
if m:
fragment_counter+=1
m = m.groups() [0]
fragment_dict["index"]=fragment_counter
fragment_dict["fragment_type"]=name
fragment_dict["value"]=m
print fragment_dict
fragments_list.append(fragment_dict)
sequence = sequence [len (m):]
found = True
break
if not found: raise Exception ('Unrecognized sequence')
print fragments_list
每次點擊「打印fragment_dict」線時間,我得到正確的(預期)輸出:
{'index': 1, 'fragment_type': 'Sequence', 'value': 'FFFFFF'}
{'index': 2, 'fragment_type': 'Range', 'value': '{7}'}
{'index': 3, 'fragment_type': 'Sequence', 'value': 'FFFFFF'}
然而,列表項fragments_list
是最終字典的3份,不每條線作爲我期望:
[{'index': 3, 'fragment_type': 'Sequence', 'value': 'FFFFFF'}, {'index': 3, 'fragment_type': 'Sequence', 'value': 'FFFFFF'}, {'index': 3, 'fragment_type': 'Sequence', 'value': 'FFFFFF'}]
我假設這是因爲append
引用字典的實例,而不是複製字典的每個迭代。我看着使用list()
函數,但在字典項目,它只是給了我一個字典鍵列表。
我在做什麼錯?
我並不喜歡數據類型,我只需要一種方法來爲每個我找到的片段保存3個數據元素(也許是第4個)。
嘿,這太棒了,謝謝!我的下一個磚牆正面臨着我,我懷疑你的修改過的方法將幫助我適當地瀏覽結果數據對象。我會實現,然後看看我能做什麼,但基本上,下一個任務是能夠基於某種邏輯爲每個序列提取片段實體 - (例如哪個片段實體具有最大的len(),它的索引是什麼)。我確信我很快會回來問問題,但是再次感謝您的意見,這非常有用!既解決手頭的問題,又看到有經驗的用戶如何解決問題! – 2013-02-19 23:13:50
它可能非常反對這裏的事情,但我想再次感謝你的幫助。花了一些時間把它放在一起,你的代碼是完美的,很容易(1)看到正在發生的事情和(2)與之合作。它可以完全像我想象的那樣執行。我荒謬的讚賞! – 2013-02-20 19:26:52
不客氣,我很樂意提供幫助。一旦你設定好了,我也很樂意同行評審你的代碼。人們總是可以相互學習一點。不幸的是,SO不允許私人信息,但如果您可以在此留下電子郵件地址,我會與您聯繫,以防您希望進行同行評審。 – Hyperboreus 2013-02-20 20:55:18