无论顺序如何,都可以从主列表中生成带有匹配词的列表

时间:2019-01-05 08:02:47

标签: python regex python-3.x string pandas

我已经创建了一个列表,我们称之为主列表

master=['abc 1.2 px', 'pqr 5.4 tr', '1.8 cmq', 'pst 2.5']

现在我有另一个列表,如

l1=['1.2 abc px', 'pqr tr 5.4', 'cmq 1.8', '1.8 cmq', '2.5 pst', 'abc 1.2 px']

我想修改l1,它将取自master的名称,其中显示所有单词,而与顺序无关。例如,修改后的列表将是

l2=['abc 1.2 px', 'pqr 5.4 tr', '1.8 cmq', '1.8 cmq', 'pst 2.5','abc 1.2 px']

如何使用python做到这一点?

1 个答案:

答案 0 :(得分:2)

请考虑创建一个“规范化”字典,其中的值是master中的单词,而键是其唯一表示形式,例如子单词的排序元组。如果一个单词中的所有子单词始终不同,则可以使用frozenset

def normalize(word):
    return tuple(sorted(word.split()))
    # return frozenset(word.split())

normalized = {normalize(m) : m for m in master}
#{('1.2', 'abc', 'px'): 'abc 1.2 px', 
# ('5.4', 'pqr', 'tr'): 'pqr 5.4 tr', 
# ('1.8', 'cmq'): '1.8 cmq', ('2.5', 'pst'): 'pst 2.5'}

您现在可以将l1中的每个单词转换为规范化的形式并在字典中查找:

[normalized.get(normalize(m), m) for m in l1]
#['abc 1.2 px', 'pqr 5.4 tr', '1.8 cmq', '1.8 cmq', 'pst 2.5', 'abc 1.2 px']

请注意,如果某个单词不在master中,则方便地保持不变。