考虑以下因素:
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
每次它到达“print 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
是最终 dict 的 3 个副本,而不是我期望的每一行:
[{'index': 3, 'fragment_type': 'Sequence', 'value': 'FFFFFF'}, {'index': 3, 'fragment_type': 'Sequence', 'value': 'FFFFFF'}, {'index': 3, 'fragment_type': 'Sequence', 'value': 'FFFFFF'}]
我假设这是因为 append
引用了字典的实例,而不是复制字典的每个迭代。我查看了使用 list()
函数,但在 dict 项上它只给了我一个 dict 键的列表。
我做错了什么?
我不拘泥于数据类型,我只需要一种方法来为我找到的每个片段保存 3 个数据元素(也许是第 4 个)。
最佳答案
你非常接近。代替 list()
函数,它从任何序列生成一个新的 list
(在这种情况下,作为序列的 dict
是一个序列它的键),使用 dict()
函数,它从任何映射生成一个新的 dict
。
或者,也许更简单,只需使用 copy
方法。
或者,更简单地说,只需将 fragment_dict= {}
移动到循环中,这样您就可以构建一个新的 dict
而不是继续重复使用同一个。
关于Python:将重复字典复制到列表中 - 最后一个字典项被欺骗到所有列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14948500/