为了账号安全,请及时绑定邮箱和手机立即绑定

从两个 python 字符串中删除相等的字符

从两个 python 字符串中删除相等的字符

aluckdog 2023-05-23 10:19:07
我正在编写一个 Python 代码来从位于相同索引上的两个字符串中删除相同的字符。例如,remove_same('ABCDE', 'ACBDE')应该将两个参数设为 BC 和 CB。我知道字符串在这里是不可变的,所以我将它们转换为列表。我收到索引错误。def remove_same(l_string, r_string):    l_list = list(l_string)    r_list = list(r_string)    i = 0    while i != len(l_list):        print(f'in {i} length is {len(l_list)}')        while l_list[i] == r_list[i]:            l_list.pop(i)            r_list.pop(i)        if i == len(l_list) - 1:            break        if i != len(l_list):            i += 1    return l_list[0] == r_list[0]
查看完整描述

4 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

在那种情况下我会避免使用 while 循环,我认为这是一个更好更清晰的解决方案:


def remove_same(s1, s2):

    l1 = list(s1)

    l2 = list(s2)

    out1 = []

    out2 = []

    for c1, c2 in zip(l1, l2):

        if c1 != c2:

            out1.append(c1)

            out2.append(c2)

            

    s1_out = "".join(out1)

    s2_out = "".join(out2)

    

    print(s1_out)

    print(s2_out)


它可以使用一些列表理解来缩短,但我试图尽可能明确


查看完整回答
反对 回复 2023-05-23
?
浮云间

TA贡献1829条经验 获得超4个赞

我觉得这可能是个问题。

while l_list[i] == r_list[i]:
            l_list.pop(i)
            r_list.pop(i)

这可以减少列表的大小,它可以低于i.

如果 l_list = ["a"] 和 r_list = ["a"],请对此进行预演。


查看完整回答
反对 回复 2023-05-23
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

在循环中修改列表通常不是一个好主意。这是一个更简洁、更 Pythonic 的解决方案。这两个字符串被压缩并并行处理。每对相等的字符被丢弃,剩余的字符排列成新的字符串。


a = 'ABCDE'

b = 'ACFDE'


def remove_same(s1, s2):

    return ["".join(s) for s

            in zip(*[(x,y) for x,y in zip(s1,s2) if x!=y])]


remove_same(a, b)

#['BC', 'CF']


查看完整回答
反对 回复 2023-05-23
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

干得好:


def remove_same(l_string, r_string):

    # if either string is empty, return False

    if not l_string or not r_string:

        return False

    l_list = list(l_string)

    r_list = list(r_string)

    limit = min(len(l_list), len(r_list))

    i = 0

    while i < limit:

        if l_list[i] == r_list[i]:

            l_list.pop(i)

            r_list.pop(i)

            limit -= 1

        else:

            i += 1


    return l_list[0] == r_list[0]



print(remove_same('ABCDE', 'ACBDE'))

输出:


False


查看完整回答
反对 回复 2023-05-23
  • 4 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信