【问题标题】:How to compare two lists of strings whose elements patially match如何比较其元素部分匹配的两个字符串列表
【发布时间】:2021-11-04 23:26:31
【问题描述】:

我有这两个列表:

list_y= ['aaa/bbb/ccc/18_12_13_y_n', 'aaa/bbb/ccc/11_14_13_y_n', 'aaa/bbb/ccc/11_12_14_y_n', 'aaa/bbb/ccc/11_12_16_y_n', 'aaa/bbb/ccc/14_12_13_y_n', 'aaa/bbb/ccc/11_17_13_y_n', 'aaa/bbb/ccc/11_12_19_y_n', 'aaa/bbb/ccc/11_12_13_y_n', 'aaa/bbb/ccc/11_12_17_y_n', 'aaa/bbb/ccc/11_12_18_y_n', 'aaa/bbb/ccc/15_12_13_y_n', 'aaa/bbb/ccc/12_12_13_y_n', 'aaa/bbb/ccc/11_16_13_y_n', 'aaa/bbb/ccc/16_12_13_y_n', 'aaa/bbb/ccc/11_12_15_y_n', 'aaa/bbb/ccc/17_12_13_y_n', 'aaa/bbb/ccc/13_12_13_y_n', 'aaa/bbb/ccc/11_13_13_y_n', 'aaa/bbb/ccc/18_12_13_y_n', 'aaa/bbb/ccc/11_15_13_y_n']

list_x= ['aaa/bbb/ccc/11_12_13_x_n', 'aaa/bbb/ccc/11_13_13_x_n', 'aaa/bbb/ccc/11_14_13_x_n', 'aaa/bbb/ccc/11_17_13_x_n', 'aaa/bbb/ccc/14_12_13_x_n', 'aaa/bbb/ccc/11_12_19_x_n', 'aaa/bbb/ccc/12_12_13_x_n', 'aaa/bbb/ccc/11_12_14_x_n', 'aaa/bbb/ccc/11_16_13_x_n', 'aaa/bbb/ccc/11_12_18_x_n', 'aaa/bbb/ccc/17_12_13_x_n', 'aaa/bbb/ccc/11_12_15_x_n', 'aaa/bbb/ccc/11_12_17_x_n', 'aaa/bbb/ccc/11_15_13_x_n', 'aaa/bbb/ccc/11_12_16_x_n', 'aaa/bbb/ccc/16_12_13_x_n', 'aaa/bbb/ccc/18_12_13_x_n', 'aaa/bbb/ccc/15_12_13_x_n', 'aaa/bbb/ccc/13_12_13_x_n', 'aaa/bbb/ccc/18_12_13_x_n']

我想比较它们是否具有相同的字符串(x 或 y 字母除外),然后我想知道 list_x 中的每个字符串是否与 list_y 中的对应字符串处于相同位置

这是我尝试过的:

list_a.sort()
list_b.sort()
list_a[0][0:21] == list_b[0][0:21]

这返回 True,因为我正在比较每个字符串的前 22 个元素,这很好,问题是这样我只对列表中的第一个字符串执行此操作。如何对整个列表进行处理?

总结一下我的疑惑:

  • 如何比较两个仅部分匹配的字符串列表?
  • 我使用 list_a[0][0:21] == list_b[0][0:21] 来比较字符串的前 22 个元素,但是有没有办法“排除” x 和 y 以及比较整个字符串?

谢谢。

【问题讨论】:

  • 哦,是的,如果他们一开始有相同的字符,那没关系,谢谢
  • 对不起,我看错了。我正在排序,因为两个列表中的字符串在 x 或 y 之前具有相同的元素(相同的字母),所以排序会将它们放在相同的位置,不是吗?

标签: python list string-comparison


【解决方案1】:

这将测试两个条件并打印两个条件的结果

list_x.sort()
list_y.sort()

list_x_mod = []
list_y_mod = []

for i in list_x:
    list_x_mod.append(i[0:21])

for i in list_y:
    list_y_mod.append(i[0:21])

index = 0
while index < len(list_x_mod):
    if list_x_mod[index] in list_y_mod:
        print("Item", index, "in list_x exist in list_y")
    if list_x_mod[index] == list_y_mod[index]:
        print("Item", index, "is in same position on both list")
    index += 1

即使他们不在同一个位置,这也会测试。

【讨论】:

    【解决方案2】:

    我们假设列表的长度相同 (len(list_x)==len(list_y)) 并且所有排序操作都已完成...

    变体 1 比较没有 21-s 符号的字符串

    length_x=len(list_x)
    for i in range(0,length_x):
        if list_x[i][0:21] == list_y[i][0:21] and list_x[i][22:]==list_y[i][22:]:
            print 'Strings are equal at pos: %d' % i #countdown starts from 0
    

    变体 2 比较不带 x 和 y 符号的字符串。 x 和 y 被整个字符串中的正则表达式删除

    import re
    length_x=len(list_x)
    
    for i in range(0,length_x):
        if re.sub('[xy]','',list_x[i])==re.sub('[xy]','',list_y[i]):
            print 'Strings are equal at pos: %d' % i #countdown starts from 0
    

    结果

    Strings are equal at pos: 4
    Strings are equal at pos: 9
    

    【讨论】:

    • 请修改你的答案,详细说明你做了什么。
    【解决方案3】:

    使用 zip 函数和 for 循环:

    for a_string, b_string in zip(list_a, list_b):
        if a_string[0:21] == b_string[0:21]:
            print("a_string anf b_string are partially identical")
    

    【讨论】:

    • 谢谢,有没有办法排除“x”或“y”并比较整个字符串(不取前22个元素)?
    • 简短但讨厌的方法是这样的:a_string[:i] + a_string [i+1:] == b_string[:i] + b_string [i+1:] 其中 i 是您的 x/y 的索引
    • 另一个 imo 更优雅的解决方案可能看起来像这样:a_split = a_string.split('y') 这会将 a_string 沿每个 'y' 拆分并与剩余的字符串部分组成一个列表 a_joined = ''.join(a_split) 这会将所有先前拆分的元素放回去成一个字符串,但没有'y's。对b_string做同样的事情,然后你可以比较两者
    猜你喜欢
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多