我对在python中实现以下逻辑的方法感到困惑。我在选择方法时需要专家建议。
我必须在某些列中用预定义的值替换字符串。 例如,
|是分隔符
输入:
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替换它。值可以是随机的。
我的方法如下
我觉得这可能是糟糕的编码方式。除上述方法之外还有什么不同的方法吗?请建议一种方法。
不同文件的列可能不同。它应该是dynmaic
答案 0 :(得分:1)
您可以利用str.translate
和str.maketrans
让您的生活更轻松:
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'
答案 1 :(得分:1)
这是使用str.join
列表推导的一种方式。
诀窍是将字典转换为Python dict
。
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']
答案 2 :(得分:1)
这应该这样做:
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)