我不明白你奇怪的行为

2024-04-24 13:22:30 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能给我解释一下,为什么当我删除包含“#duplicate”的行时会得到不同的结果?你知道吗

import re    

def nysiis(term: str) -> str:
    """
    returns New York State Identification and Intelligence Algorithm (NYSIIS) code for given term
    """

    if not len(term):
        return ''
    else:
        term = term.upper()

    table = {
        r'\W+': '',  # remove whitespace and non-word characters

        r'^MAC': 'MCC',
        r'^KN': 'NN',
        r'K': 'C',
        r'PH|PF': 'FF',
        r'SCH': 'SSS',

        r'(EE|IE)$': 'Y',
        r'(DT|ND|NT|RD|RT)$': 'D',

        # From now on first letter must no longer change.
        r'(?<!^)EV': 'AF',
        r'(?<!^)[AEIOU]': 'A',
        r'(?<!^)Q': 'G',
        r'(?<!^)Z': 'S',
        r'(?<!^)(?:M|KN)': 'N',

        r'(?<!^)([^AEIOUY])H': r'\1',
        r'(?<!^)(.)H[^AEIOUY]': r'\1',
        r'(?<!^)([AEIOUY])W': r'\1',

        r'AY$': r'Y',
        r'S$': r'',

        r'(\w)\1+': r'\1',  # original
        r'A+$': r''  # original
    }

    for k, v in table.items():
        term = re.sub(k, v, term)

    table = {  # duplicate
        r'(\w)\1+': r'\1',  # duplicate
        r'A+$': r''  # duplicate
    }  # duplicate

    for k, v in table.items():  # duplicate
        term = re.sub(k, v, term)  # duplicate

    return term

if __name__ == '__main__':
    names = [
        'Bishop', 'Carlson', 'Carr', 'Chapman', 'Franklin',
        'Greene', 'Harper', 'Jacobs', 'Larson', 'Lawrence',
        'Lawson', 'Louis, XVI', 'Lynch', 'Mackenzie', 'Matthews',
        'McCormack', 'McDaniel', 'McDonald', 'Mclaughlin', 'Morrison',
        "O'Banion", "O'Brien", 'Richards', 'Silva', 'Watkins',
        'Wheeler', 'Willis', 'brown, sr', 'browne, III', 'browne, IV',
        'knight', 'mitchell', "o'daniel",
    ]

    for name in names:
        print('%15s: %s' % (name, nysiis(name)))

Tags: andnameinreforreturniftable
1条回答
网友
1楼 · 发布于 2024-04-24 13:22:30

您不想使用dict来替换:迭代的顺序与列出它们的顺序不同。如果你把你的dict改成一个成对的列表,那么它就会如你所期望的那样工作。你知道吗

table = [
    (r'\W+', ''),
    #...
]

for k, v in table:
    ...

相关问题 更多 >