2015-05-06 28 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)