【问题标题】:Python match similar strings and group them together from two listsPython匹配相似的字符串并将它们从两个列表中组合在一起
【发布时间】:2021-02-08 12:58:00
【问题描述】:

我在 python 中有两个列表:

A = ["Opn", "Jan-20 A", "Feb-20 A", "Mar-20 A"]
B = ["Jan-20 B", "Mar-20 B", "Apr-20 B", "Cls"]

我想将具有相似月份-年份的字符串组合在一起,并获得如下输出。不匹配的字符串将与空字符串分组

[("Opn",""),("Jan-20 A","Jan-20 B"),("Feb-20 A",""),("Mar-20 A","Mar-20 B"),("","Apr-20 B"),("","Cls")]

我的方法是这样的。是 O(n^2),想知道是否有更有效的方法。

output = []
pair = False
for i in A:
    for j in B:
        if i.split()[0] == j.split()[0]:
            output.append((i,j))
            pair = True
            B.remove(j)
            break
    if not(pair):
        output.append((i,''))
    pair = False
output = output + [("",j) for j in B]

这样做的有效方法是什么?

【问题讨论】:

  • 请分享您的尝试以及您遇到的问题。
  • 字符串是随机的吗? OpnCls - 这些是什么?
  • 是的,可以有随机字符串。只需要对匹配的字符串进行分组。给我2分钟,我会发布我的方法。它的 O(n^2),想知道是否有更有效的方法?

标签: python python-3.x string algorithm


【解决方案1】:

你可以试试这个。这是一个 O(n) 的解决方案

A = ["Opn", "Jan-20 A", "Feb-20 A", "Mar-20 A"]
B = ["Jan-20 B", "Mar-20 B", "Apr-20 B", "Cls"]

store ={}
output = []

for i in A:
    store[i.split()[0]] =i;

# print(store)

for j in B:
    key = j.split()[0]
    if key in store:
        output.append((store[key],j))
        del store[key]
    else:
        output.append(('',j))

for key in store:
    output.append((store[key],''))

print(output)

【讨论】:

    【解决方案2】:

    如果性能不是问题,这是一种方法:

    A = ["Opn", "Jan-20 A", "Feb-20 A", "Mar-20 A"]
    B = ["Jan-20 B", "Mar-20 B", "Apr-20 B", "Cls"]
    
    res=[(i, '') for i in A]
    
    for i in range(len(res)):
        for k in B:
            if res[i][0][:6]==k[:6]:
                res[i]=(res[i][0], k)
    
    for k in B:
        if all(i[:6]!=k[:6] for i in A):
            res.append(('',k)) 
    
    print(res)
    

    输出:

    [('Opn', ''), ('Jan-20 A', 'Jan-20 B'), ('Feb-20 A', ''), ('Mar-20 A', 'Mar-20 B'), ('', 'Apr-20 B'), ('', 'Cls')]
    

    【讨论】:

    • 我在上面发布的方法(在问题中)具有相同的 O(n^2) 时间复杂度。我正在寻找一种更有效的方法来做到这一点
    • 所有字符串的格式是否相同? (“XXX-XX A”还是“XXX-XX B”)?如果不是,所有对 (6) 的公共子串的长度是否相等?任何信息都会有所帮助
    • 一些应该匹配的字符串将始终采用相同的格式(MMM-YY A 或 MMM-YY B)。其他不是这种格式的将不匹配,这没关系
    【解决方案3】:

    使用dict可以得到O(n+m)

    from collections import defaultdict 
    from itertools import chain
    
    d = defaultdict(list)
    
    A = ["Opn", "Jan-20 A", "Feb-20 A", "Mar-20 A"]
    B = ["Jan-20 B", "Mar-20 B", "Apr-20 B", "Cls"]
    
    for i in chain(A,B):
        d[i[:6]].append(i)
    
    print(list(d.values()))
    
    [['Opn'], ['Jan-20 A', 'Jan-20 B'], ['Feb-20 A'], ['Mar-20 A', 'Mar-20 B'], ['Apr-20 B'], ['Cls']]
    ​```
    

    【讨论】:

      猜你喜欢
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-07
      • 2015-12-20
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      相关资源
      最近更新 更多