如何在python中进行替换';什么是迪克特?
我想要实现的目标是将所有形式为如何在python中进行替换';什么是迪克特?,python,dictionary,Python,Dictionary,我想要实现的目标是将所有形式为#item_name#的项交换到dict中的from(item_value)。我使用两个dictnamedtest1和test2来测试我的功能。代码如下: test1={'integer_set': '{#integer_list#?}', 'integer_list': '#integer_range#(?,#integer_range#)*', 'integer_range': '#integer#(..#integer#)?', 'integer': '[+-
#item_name#
的项交换到dict中的from(item_value)
。我使用两个dict
namedtest1
和test2
来测试我的功能。代码如下:
test1={'integer_set': '{#integer_list#?}', 'integer_list': '#integer_range#(?,#integer_range#)*', 'integer_range': '#integer#(..#integer#)?', 'integer': '[+-]?\\d+'}
test2={'b': '#a#', 'f': '#e#', 'c': '#b#', 'e': '#d#', 'd': '#c#', 'g': '#f#', 'a': 'correct'}
def change(pat_dict:{str:str}):
print('Expanding: ',pat_dict)
num=0
while num<len(pat_dict):
inv_pat_dict = {v: k for k, v in pat_dict.items()}
for value in pat_dict.values():
for key in pat_dict.keys():
if key in value:
repl='#'+key+'#'
repl2='('+pat_dict[key]+')'
value0=value.replace(repl,repl2)
pat_dict[inv_pat_dict[value]]=value0
num+=1
print('Result: ',pat_dict)
change(test1)
change(test2)
但大多数时候我都会得到这样的错误结果:
Expanding: {'integer_range': '#integer#(..#integer#)?', 'integer': '[+-]?\\d+', 'integer_set': '{#integer_list#?}', 'integer_list': '#integer_range#(?,#integer_range#)*'}
Result: {'integer_range': '([+-]?\\d+)(..([+-]?\\d+))?', 'integer': '[+-]?\\d+', 'integer_set': '{(#integer_range#(?,#integer_range#)*)?}', 'integer_list': '#integer_range#(?,#integer_range#)*'}
Expanding: {'f': '#e#', 'a': 'correct', 'd': '#c#', 'g': '#f#', 'b': '#a#', 'c': '#b#', 'e': '#d#'}
Result: {'f': '(((((correct)))))', 'a': 'correct', 'd': '(((correct)))', 'g': '((((((correct))))))', 'b': '(correct)', 'c': '((correct))', 'e': '((((correct))))'}
如何更新代码以实现我的目标?您的问题是由python字典无序这一事实造成的。尝试使用一个而不是
dict
,你会没事的。OrderedDict的工作原理与普通的dict
一样,但保留了订单,性能成本很低
请注意,虽然您可以从dict文本创建OrderedDict(就像我在这里首先做的那样),但该dict将是无序的,因此可能无法保证排序。使用(键、值)
对的列表在所有情况下都会保留顺序
from collections import OrderedDict
test1=OrderedDict([('integer_set', '{#integer_list#?}'), ('integer_list', '#integer_range#(?,#integer_range#)*'), ('integer_range', '#integer#(..#integer#)?'), ('integer', '[+-]?\\d+')])
test2=OrderedDict([('b', '#a#'), ('f', '#e#'), ('c', '#b#'), ('e', '#d#'), ('d', '#c#'), ('g', '#f#'), ('a', 'correct')])
def change(pat_dict:{str:str}):
print('Expanding: ',pat_dict)
num=0
while num<len(pat_dict):
inv_pat_dict = {v: k for k, v in pat_dict.items()}
for value in pat_dict.values():
for key in pat_dict.keys():
if key in value:
repl='#'+key+'#'
repl2='('+pat_dict[key]+')'
value0=value.replace(repl,repl2)
pat_dict[inv_pat_dict[value]]=value0
num+=1
print('Result: ',pat_dict)
change(test1)
change(test2)
从集合导入订单数据
test1=OrderedDict([('integer_set','{{integer_list#?}'),('integer_list','#integer_range#(?,#integer_range##)*',('integer#range','#integer#(..#integer##)?),('integer','[+]?\\d+]))
测试2=OrderedDict([('b','a'),('f','e'),('c','b'),('e','d'),('d','d','c',('g','f'),('a','correct'))
定义更改(pat_dict:{str:str}):
打印('展开:',单字)
num=0
而num试试这个。您的问题是由于起始dict发生变异。您需要更改其副本
test1={'integer_set': '{#integer_list#?}', 'integer_list': '#integer_range#(?,#integer_range#)*', 'integer_range': '#integer#(..#integer#)?', 'integer': '[+-]?\\d+'}
test2={'b': '#a#', 'f': '#e#', 'c': '#b#', 'e': '#d#', 'd': '#c#', 'g': '#f#', 'a': 'correct'}
def change(d):
new_d = d.copy()
for k in d.keys():
for nk, v in new_d.items():
if k in v:
new_d[nk] = v.replace('#{}#'.format(k), '({})'.format(new_d[k]))
return new_d
test1 = change(test1)
test2 = change(test2)
随机化是指用户可以在dict
中创建任意键,并可能手工制作所述键以引起哈希冲突,从而将大多数dict
操作从O(1)
减少到O(n)
。它影响迭代顺序的事实实际上并不是一个设计目标(事实上,在CPython 3.6中,dict
s在默认情况下很可能以插入顺序迭代,因为实现更改恰好实现了这一点,这是对内存不足的dict
design的更改的自由副作用)。Go中也存在同样的行为,即避免开发人员信任map
输出的顺序。编辑。我不明白的是,为什么每次读取时迭代顺序都会改变,而没有间歇写入;这将如何避免散列冲突@暗影游侠
test1={'integer_set': '{#integer_list#?}', 'integer_list': '#integer_range#(?,#integer_range#)*', 'integer_range': '#integer#(..#integer#)?', 'integer': '[+-]?\\d+'}
test2={'b': '#a#', 'f': '#e#', 'c': '#b#', 'e': '#d#', 'd': '#c#', 'g': '#f#', 'a': 'correct'}
def change(d):
new_d = d.copy()
for k in d.keys():
for nk, v in new_d.items():
if k in v:
new_d[nk] = v.replace('#{}#'.format(k), '({})'.format(new_d[k]))
return new_d
test1 = change(test1)
test2 = change(test2)