А если еще проще сделать?
def change_tag(tag, key,value):
return [(k,value) if k==key else (k,v) for k,v in tag]
from collections import OrderedDict
from timeit import Timer
def with_dict(src, key, value):
tmp = OrderedDict(src)
tmp[key] = value
return tmp.items()
def forehead(src, key, value):
for k, v in src:
yield (k, value) if k == key else (k, v)
def change_tag(tag, key,value):
return [(k,value) if k==key else (k,v) for k,v in tag]
if "__main__" == __name__:
tag = (("key1", "value1"), ("key2", "value2"), ("key3", "value3"),
("key4", "value4"), ("key5", "value5"), ("key6", "value6"))
print list(with_dict(tag, 'key2', 'new_key2_value'))
print list(forehead(tag, 'key2', 'new_key2_value'))
print change_tag(tag, 'key2', 'new_key2_value')
t1 = Timer("list(with_dict(tag, 'key2', 'new_key2_value'))",
"from __main__ import with_dict, tag")
t2 = Timer("list(forehead(tag, 'key2', 'new_key2_value'))",
"from __main__ import forehead, tag")
t3 = Timer("change_tag(tag, 'key2', 'new_key2_value')",
"from __main__ import change_tag, tag")
print t1.timeit()
print t2.timeit()
print t3.timeit()
[('key1', 'value1'), ('key2', 'new_key2_value'), ('key3', 'value3'), ('key4', 'value4'), ('key5', 'value5'), ('key6', 'value6')]
[('key1', 'value1'), ('key2', 'new_key2_value'), ('key3', 'value3'), ('key4', 'value4'), ('key5', 'value5'), ('key6', 'value6')]
[('key1', 'value1'), ('key2', 'new_key2_value'), ('key3', 'value3'), ('key4', 'value4'), ('key5', 'value5'), ('key6', 'value6')]
28.1137778759
1.90166282654
1.11240196228