使用具有预定义值的多个替换基于列的字符串 - Python

时间:2018-04-18 13:05:53

标签: 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,我应该得到QWER。如果它是TU那么它应该用PL替换它。值可以是随机的。

我的方法如下

  1. 阅读一行,然后转到第1列
  2. 读取每个字符并使用替换值逐个替换
  3. 转到第4列,然后阅读每个字符并逐个替换
  4. 转到下一行等等....
  5. 我觉得这可能是糟糕的编码方式。除上述方法之外还有什么不同的方法吗?请建议一种方法。

    不同文件的列可能不同。它应该是dynmaic

3 个答案:

答案 0 :(得分:1)

您可以利用str.translatestr.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)