列出迭代和编辑列表的项目,请改进我的代码

时间:2014-04-07 02:55:56

标签: python python-3.x

a = ['also', 'akin', 'akee', 'ague', 'aero', 
     'anes', 'bute', 'byre', 'came', 'case', 
     'doze', 'down', 'drek', 'drew', 'dyes', 
     'fret', 'freo']
i = 'e'
b = []

for item in a:
    for chr in item:
        if chr != i:
            b.append(item.replace(chr,"-"))          

print(b)

打印结果:

['-lso', 'a-so', 'al-o', 'als-', '-kin', 'a-in', 'ak-n', 'aki-', '-kee', 'a-ee', '-gue', 'a-ue', 'ag-e', '-ero', 'ae-o', 'aer-', '-nes', 'a-es', 'ane-', '-ute', 'b-te', 'bu-e', '-yre', 'b-re', 'by-e', '-ame', 'c-me', 'ca-e', '-ase', 'c-se', 'ca-e', '-oze', 'd-ze', 'do-e', '-own', 'd-wn', 'do-n', 'dow-', '-rek', 'd-ek', 'dre-', '-rew', 'd-ew', 'dre-', '-yes', 'd-es', 'dye-', '-ret', 'f-et', 'fre-', '-reo', 'f-eo', 'fre-']

在上面的例子中,a是一个单词列表。对于列表中的每个项目,我想遍历每个字符。如果某个字符不是字母'e',请用短划线'-'替换该字符。

因此,没有"also"的单词'e'应该变为"----",而不是四个不同的项目,每个项目都有不同位置的短划线。

任何建议都表示赞赏。

由于

5 个答案:

答案 0 :(得分:2)

使用列表理解和join

lst = ['also', 'akin', 'akee', 'ague', 'aero',
     'anes', 'bute', 'byre', 'came', 'case', 
     'doze', 'down', 'drek', 'drew', 'dyes', 
     'fret', 'freo']

i = 'e'

new_lst = []

for item in lst:
    new_lst.append(''.join('-' if c != i else c for c in item))

print new_lst

输出:

['----', '----', '--ee', '---e', '-e--', '--e-', '---e', '---e', '---e', '---e', '---e', '----', '--e-', '--e-', '--e-', '--e-', '--e-']

答案 1 :(得分:1)

我可能会建议在这里使用正则表达式替换。

创建一个匹配所有非e字符的正则表达式,并映射一个函数,该函数用' - '替换每个非e字符。 a中的每个元素。

import re
not_e = re.compile(r'[^e]')
b = map(lambda word: not_e.sub('-', word), a)

以上代码的一个衬垫:

b = map(lambda word: re.sub(r'[^e]', '-', word), a)

如果你想坚持使用更详细的语法,你也可以在问题中循环并追加。

for word in a:
    b.append(non_e.sub('-', word))

答案 2 :(得分:0)

在循环的最里面,您正在扫描每个字母。但是在您拥有的代码中,您将在b附加一个项目。因此,对于输入的每个字母,您将拥有完整的输出字符串 - 而不是您想要的内容。

试试这个:

for item in a:
    bitem = ''
    for chr in item:
        if chr != i:
            bitem += '-'
        else:
            bitem += chr
    b.append(bitem)

话虽如此,还有其他方法可以实现这一点,这可能更简单。 请参阅其他技巧的其他优秀答案 - 我只是给出了原始代码的更正版本。

答案 3 :(得分:0)

a = ['also', 'akin', 'akee', 'ague', 'aero', 
     'anes', 'bute', 'byre', 'came', 'case', 
     'doze', 'down', 'drek', 'drew', 'dyes', 
     'fret', 'freo']
i = 'e'

for b in range(0, len(a)):
    k = list(a[b])
    for i in range(0, len(k)):
        if k[i] != 'e':
            k[i] = '-'
    k = ''.join(k)
    a[b] = k

使用双for个循环,一个用于获取每个单词,另一个用于循环遍历每个单词。从那里,您可以检查每个是否是' e。

输出:

['----', '----', '--ee', '---e', '-e--', '--e-', '---e', '---e', '---e', '---e', '---e', '----', '--e-', '--e-', '--e-', '--e-', '--e-']

答案 4 :(得分:0)

不需要花哨的循环:

[''.join(c if c == 'e' else '-' for c in s) for s in a]