python:替换替换错误的行的位置

时间:2016-03-01 01:07:04

标签: python python-2.7 replace

我有原始行:
2.48724e-008 0.00022974 0.65 1 4 0 0 0.0002 2 2 2 0
我想换新线:
6.1054382342e-10 1.26357e-05 0.65 1 4 0 0 1.1e-05 2 2 2 0

代码:

replacement = {'2.48724e-008':'6.1054382342e-10','0.00022974':'1.26357e-05','0.0002':'1.1e-05')}
for src, target in replacement.iteritems():
      line = line.replace(src,target)

但结果是:
6.1054382342e-10 1.1e-052974 0.65 1 4 0 0 1.1e-05 2 2 2 0

第二个数字错了。好像python在原始行中找到了'0.0002',并将其替换为'1.1e-05',无论它是什么。

请你帮帮我吗?

3 个答案:

答案 0 :(得分:5)

问题来自于使用dict,密钥可以按任何顺序出现。一个可迭代的(元组或列表)就足以完成你的工作

replacement = (
  ('2.48724e-008','6.1054382342e-10'),
  ('0.00022974','1.26357e-05'),
  ('0.0002','1.1e-05')
)   
for src, target in replacement:
  line = line.replace(src,target)

答案 1 :(得分:3)

首先对键进行排序:

replacement = {'2.48724e-008':'6.1054382342e-10','0.00022974':'1.26357e-05','0.0002':'1.1e-05')}
for src, target in sorted(replacement.items(), reverse=True):
    line = line.replace(src,target)

答案 2 :(得分:2)

最好在您的情况下使用list tuple

 >>> replacement = [('2.48724e-008','6.1054382342e-10'), ('0.00022974','1.26357e-05'), ('0.0002':'1.1e-05'})]
 >>> for src, target in replacement:
     ... line = line.replace(src,target)

代码意外行为的原因: python中的dict不会按照定义的顺序存储{'key': 'value'}对。因此,定义哪个字典的顺序以及使用dict.iteritems()迭代它的顺序可能会发生变化。对于要维护输入元素的字典顺序的情况,请使用OrderedDict。例如(根据您的问题):

>>> import collections
>>> sequence_list = [('2.48724e-008','6.1054382342e-10'),('0.00022974','1.26357e-05'), ('0.0002':'1.1e-05'})]
>>> replacement = collections.OrderedDict()
>>> for key, value in sequence_list:
    replacement[key] = value