python:替换行的错误位置
我有原始行:python:替换行的错误位置,python,python-2.7,replace,Python,Python 2.7,Replace,我有原始行: 2.48724e-008 0.00022974 0.65 14 0 0 0.0002 2 2 0 我想要新台词: 6.1054382342e-10 1.26357e-05 0.65 1 4 0 1.1e-05 2 0 代码: 但结果是: 6.1054382342e-10 1.1e-052974 0.65 1 4 0 1.1e-05 2 0 第二个号码错了。python似乎在原始行中找到了“0.0002”,并将其替换为“1.1e-05”,无论后面是什么 你能帮我做这个吗?先把钥匙分类
2.48724e-008 0.00022974 0.65 14 0 0 0.0002 2 2 0
我想要新台词:
6.1054382342e-10 1.26357e-05 0.65 1 4 0 1.1e-05 2 0 代码: 但结果是:
6.1054382342e-10 1.1e-052974 0.65 1 4 0 1.1e-05 2 0 第二个号码错了。python似乎在原始行中找到了“0.0002”,并将其替换为“1.1e-05”,无论后面是什么
你能帮我做这个吗?先把钥匙分类:
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)
最好在您的案例中使用
tuple
的list
:
>>> 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()
定义字典和迭代字典的顺序可能会改变。如果要保持输入元素的字典顺序,请改用。例如(根据您的问题):
问题来自这样一个事实,即使用
dict
,按键可以以任何顺序出现。一个iterable(元组或列表)就足够了
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)
对于src,target in sorted(replacement.viewitems(),reverse=True):
将消除每次迭代中查找的需要。无论如何,这些键都是唯一的,因此无论如何它都不会比较这些值。在Py3中,它只是.items()
,而不是.viewitems()
@ShadowRanger:非常感谢;我想知道能不能做点类似的事情。我应该想到这一点。您也可以在Py2中执行.items()
,这就是我在回答中所说的。是的,.items()
在Py2中工作,它只创建一个中间的列表
(其中viewitems
返回一个便宜的视图,没有键/值对的浅拷贝)。当然,sorted
会在内部生成一个列表,因此在这种情况下,items()
不会造成太大的伤害,我只是尝试提及viewitems
,因为它在大多数情况下都更好(并且行为与Py3中的.items()
完全相同)。您无法将dict
传递到OrderedDict
并获得有意义的订购;dict
的构造失去了顺序,而OrderedDict
将盲目地保留这种任意顺序。您需要传递一系列成对的值,例如,collections.orderedict([('2.48724e-008','6.1054382342e-10'),…])
以便orderedict
按预期接收它们。是的,您是正确的。更新了答案。谢谢你纠正我,我错过了那部分。酷。否决票被删除OrderedDict
在这里并不是真正必要的(毕竟,您可以直接迭代元组的列表
),但这不再是一个糟糕的答案。我也添加了这个答案。我在这里使用OrderedDict的原因是我想让OP知道问题的根本原因。否则,他将永远不会知道为什么他的程序没有如预期的那样工作
>>> 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
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)