检查字符串中的混洗字以避免重复输入

时间:2018-04-22 08:30:33

标签: python

我想在将数据保存到数据库之前创建一个管道,以避免重复的条目

例如

 1. 364 Lane Debs
 2. 364 Debs Lane
 3. 365 Lane Debs
 4. 364 debs lane

现在条目1,2,4与改组后的单词相同,其中3有不同的数字,因此它表示不同的地址。

请建议我采取行动

2 个答案:

答案 0 :(得分:0)

正则表达式不是针对此问题的可扩展和优化方法。相反,您可以使用frozenset版本的分割单词作为字典的键,以便保存行而不管其单词的顺序,并使用str.lower()忽略区分大小写。此外,为了跟踪您是否可以保留索引的实际行。

In [1]: s = """ 1. 364 Lane Debs
   ...:  2. 364 Debs Lane
   ...:  3. 365 Lane Debs
   ...:  4. 364 debs lane"""

In [8]: lines = s.splitlines()    
In [9]: {frozenset(line.lower().split()[1:]):ind for ind, line in enumerate(lines)}

Out[7]: {frozenset({'364', 'debs', 'lane'}): 3,
         frozenset({'365', 'debs', 'lane'}): 2}

或者,您可以保存线条而不是索引:

In [10]: {frozenset(line.lower().split()[1:]):line for ind, line in enumerate(lines)}
Out[10]: 
{frozenset({'364', 'debs', 'lane'}): ' 4. 364 debs lane',
 frozenset({'365', 'debs', 'lane'}): ' 3. 365 Lane Debs'}

答案 1 :(得分:0)

data = [
    {'address': 364, 'words': 'Lane Debs'},
    {'address': 364, 'words': 'Debs Lane'},
    {'address': 365, 'words': 'Lane Debs'},
    {'address': 364, 'words': 'debs lane'},
]

unique = {
    (d['address'], tuple(sorted(d['words'].casefold().split()))): d
    for d in data
}.values()

这会产生(在我的机器上):

[{'address': 365, 'words': 'Lane Debs'},
 {'address': 364, 'words': 'debs lane'}]

你的下一个问题是决定哪些重复的条目是“正确的”'之一。