检查字符串中的乱序词以避免重复输入

2024-05-29 08:28:07 发布

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

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

例如

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

现在条目1,2,4与无序词相同,其中3有不同的数字,所以它表示不同的地址

请建议我接近


Tags: 数据数据库管道地址条目数字建议无序
2条回答

对于这个问题,Regex不是一个非常可伸缩和优化的方法。相反,您可以使用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'}
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'}]

你的下一个问题是决定哪一个重复条目是正确的

相关问题 更多 >

    热门问题