Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:替换行的错误位置_Python_Python 2.7_Replace - Fatal编程技术网

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)