将基于列的字符串替换为具有预定义值的多个字符串-Python
我对在python中实现以下逻辑的方法有点困惑。在选择方法时,我需要专家的建议 我必须在某些列中用预定义值替换字符串。 例如 |是分隔符 输入:将基于列的字符串替换为具有预定义值的多个字符串-Python,python,string,python-3.x,python-2.7,list,Python,String,Python 3.x,Python 2.7,List,我对在python中实现以下逻辑的方法有点困惑。在选择方法时,我需要专家的建议 我必须在某些列中用预定义值替换字符串。 例如 |是分隔符 输入: ABCD|NewYork|800|TU XYA|England|589|IA 输出: QWER|NewYork|800|PL NHQ|England|589|DQ 预定义词典: Actual Value : ABCDEFGHIJKLMNOPQRSTUVWXYZ Replace Value : QWERTYASDFGHNBVCXZOPLKMNHY
ABCD|NewYork|800|TU
XYA|England|589|IA
输出:
QWER|NewYork|800|PL
NHQ|England|589|DQ
预定义词典:
Actual Value : ABCDEFGHIJKLMNOPQRSTUVWXYZ
Replace Value : QWERTYASDFGHNBVCXZOPLKMNHY
所以,如果值是ABCD,我应该得到QWER。如果是TU,则应将其替换为PL。值可以是随机的
我的方法如下
In [1]: fnd = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
...: rpl = 'QWERTYASDFGHNBVCXZOPLKMNHY'
...: trns = str.maketrans(fnd, rpl)
In [2]: 'ABCD'.translate(trns)
Out[2]: 'QWER'
In [4]: 'UV'.translate(trns)
Out[4]: 'LK'
这是一种通过
str.join
使用列表理解的方法
诀窍是将字典转换为Pythondict
x = ['ABCD|NewYork|800|TU',
'XYA|England|589|IA']
d = dict(zip('ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'QWERTYASDFGHNBVCXZOPLKMNHY'))
res = ['|'.join([''.join(list(map(d.get, i[0])))]+i[1:]) \
for i in map(lambda y: y.split('|'), x)]
结果:
['QWER|NewYork|800|TU',
'NHQ|England|589|IA']
这应该做到:
from string import maketrans
actual = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
replace = 'QWERTYASDFGHNBVCXZOPLKMNHY'
with open('infile.txt') as inf, open('outfile.txt', 'w') as outf:
toBeWritten = []
for line in inf:
items = line.strip().split('|')
items[0] = items[0].translate(maketrans( actual, replace))
items[3] = items[3].translate(maketrans( actual, replace))
print items
toBeWritten.append('|'.join(items))
outf.writelines(toBeWritten)
你的方法听起来不错,为什么不实施它并找出答案呢!如果你创建一个字典,将你的实际值映射为替换值
{“a”:“Q”,“B”:“W”,…}
,那么你可以稍微加快查找时间,否则我看不到任何其他可以更快的方法这是编写IMO代码的好方法。只需要检查性能。你为什么不把它编码并贴在这里进行比较呢?根据@N.Ivanov的建议:dict(zip('ABCDEFGHIJKLMNOPQRSTUVWXYZ','QWERTYASDFGHNBVCXZOPLKMNHY')
。我也会使用这个方法谢谢,我怎么能为动态列这样做呢?假设下一个文件有第2列和第3列,请让我知道。只需将项目(0和3)的索引更改为新的。谢谢。将尝试动态方法并发布它。