2015-05-06 26 views
3

替换列表中的字符(S)我有两个文本文件:与人物名单B

clues.txt - 包含字母/符号对:

A# 
M* 
N% 

words.txt - 包含列表炒的话:

#+/084&" 
#3*#%#+ 
8%203: 
,1$& 
!-*% 
.#7&33& 
#*#71% 
&-&641'2 
#))85 
9&330* 

我读过的每个文件的内容到一个列表,应用列表解析:

clues = [line.strip() for line in open("clues.txt", 'r')] 

words = [line.strip() for line in open("words.txt", 'r')] 

如何动态替换words列表中的每个符号的所有实例,并使用clues列表中的相应符号?

所以,在words#每个实例替换为A,在words*每个实例替换为M,等等。

回答

4

您可以使用str.replace创建子的双出线索每一行,然后遍历更换后重新分配到行的更新值:

with open("clues.txt", 'r') as f, open("words.txt", 'r') as f2: 
    clues = [list(line.rstrip()) for line in f] 
    for line in f2: 
     for rep, orig in clues: 
      line = line.replace(orig, rep) 
     print(line.rstrip()) 

输出:

A+/084&" 
A3MANA+ 
8N203: 
,1$& 
!-MN 
.A7&33& 
AMA71N 
&-&641'2 
A))85 
9&330M 

或者使用str.translate

with open("clues.txt", 'r') as f, open("words.txt", 'r') as f2: 
    # keys are ord of character to replace, 
    # values are character to replace with 
    d = {ord(k): v for v, k in (list(line.rstrip()) for line in f)} 
    for line in f2: 
     print(line.translate(d).rstrip()) 

输出:

A+/084&" 
A3MANA+ 
8N203: 
,1$& 
!-MN 
.A7&33& 
AMA71N 
&-&641'2 
A))85 
9&330M 

对于需要使用string.maketrans创建表python2:

from string import maketrans 
with open("clues.txt", 'r') as f, open("words.txt", 'r') as f2: 
    # separate A -> # ... 
    a, b = zip(*(list(line.rstrip()) for line in f)) 
    # create table where # maps to A, * -> M and % -> N 
    tbl = maketrans("".join(b), "".join(a)) 
    for line in f2: 
     # translate each string using our mapping table 
     print(line.translate(tbl).rstrip()) 

输出:

A+/084&" 
A3MANA+ 
8N203: 
,1$& 
!-MN 
.A7&33& 
AMA71N 
&-&641'2 
A))85 
9&330M 

Python3需要的字符的ord的映射替换为你想要替换的字符串,在python 2中我们做了类似的事情,但必须使用string.maketrans来创建我们的表,最终成为字符串'#*%', 'AMN'

0

有很多方法可以做到这一点,并可能有各种限制。就像单词文件的大小一样,线索是否总是2个字符,第一个字符是要替换的字符,第二个字符是要替换的字符。这是一个简单的解决方案,你可以建立。

不是将单词读入列表中,而是先将其读取为字符串(假定文件的大小合理),然后将其替换为您的线索,然后将其分开。这样你就可以每次提供一次替换品。像:

with open('words.txt') as wfd: file_as_string = wfd.read() 
for clue in clues: words_str = file_as_string.replace(clue[1], clue[0]) 
words = [word.strip() for word in file_as_string.split('\n')] 
0

首先转换您clues实际键/值对的映射:

clues = [line.strip() for line in open("clues.txt", 'r')] 
clues = dict([(k, v) for v, k in clues]) 

然后通过每个单词的每个字符在words迭代:

for word in words: 
    for i, c in enumerate(word): 
     if c in clues: 
      word[i] = clues[c] 

不幸这不是效率最高,最坏的情况是复杂性。

更新:这方面的一个改进版本:

clues = dict([(k, v) for v, k in map(str.strip, open("clues.txt", "r"))]) 
with open("words.txt", "r") as f: 
    for i, c in enumerate(word): 
     if c in clues: 
      word[i] = clues[c] 
1

做到这一点的最有效的方法是使用string.translate

import string 

with open('clues.txt', 'r') as cluesf, open('words.txt', 'r') as wordsf: 
    clues = [line.strip() for line in cluesf] 
    trans = string.maketrans(''.join([c[1:] for c in clues]), ''.join([c[0] for c in clues])) 
    words = [line.strip().translate(trans) for line in wordsf] 

    print(words)