将基于列的字符串替换为具有预定义值的多个字符串-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

我对在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列
  • 读取每个字符并使用替换值逐个替换
  • 转到第4列,然后读取每个字符并逐个替换
  • 转到下一行,依此类推
  • 我觉得这可能是一种糟糕的编码方式。有什么不同于上述方法的方法吗?请建议一种方法

    列对于不同的文件可能不同。它应该是动态的

    你可以利用它,让你的生活更轻松:

    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
    使用列表理解的方法

    诀窍是将字典转换为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']
    
    这应该做到:

    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)的索引更改为新的。谢谢。将尝试动态方法并发布它。