【问题标题】:How to reduce a string by another string in Python?如何在Python中用另一个字符串减少一个字符串?
【发布时间】:2021-11-28 22:09:33
【问题描述】:

我想从第一个字符串 s1 中删除所有字符,恰好是它们在另一个字符串 s2 中出现的次数,即如果 s1 = "AAABBBCCCCCCD" 和 s2 = "ABBCCC" 那么结果应该是 s = "AABCCCD" . (结果字符串中的字符顺序实际上是无关紧要的,但如果可以保留它是一个加号。)

以下相当粗略的代码可以做到这一点:

def reduce_string(s1, s2):
    s = s1
    for c in s2:
        if c in s:
            s = s.replace(c, "", 1)
    return(s)

# examples
reduce_string("AAABBBCCCCCCD", "ABBCCC")
reduce_string("AAABBBCCCCCCD", "ABBCCCE")

我的问题是,是否可以通过巧妙地使用某些内置函数或至少以更优雅的方式来实现?感谢您的所有回答!

【问题讨论】:

  • 我很乐意尝试回答“为什么问题”:上下文是临床研究中的随机化。例如,字符串 s1 = "AAABBBCCCCCC" 表示 12 个人将被分配到 3 个研究组 A、B 和 C,其中控制组 C 是两个干预组 A 和 B 的两倍。 s1 将被随机排列以生成可能的分配方案。现在,s2 = "ABBCCC" 代表之前分配的一批参与者。然后,我不想置换所有参与者的分配,而是只置换尚未分配的个人。
  • 这能回答你的问题吗? Testing whether a string has repeated characters
  • @bad_coder:不,它没有,老实说,我不明白你为什么认为它可能。我的问题到底有什么不清楚的地方?

标签: python string


【解决方案1】:

您可以使用计数器对象。将一个与另一个相减,然后将剩余的元素连接在一起。

from collections import Counter

s1 = "AAABBBCCCCCCD"
s2 = "ABBCCC"

counter = Counter(s1)
counter.subtract(Counter(s2))

result = ''.join(counter.elements())
print(result)
AABCCCD

作为单行:

print(''.join((Counter(s1) - Counter(s2)).elements()))

【讨论】:

  • 这会改变顺序,所以如果你有s1 = "AAABBDCCCCCCD",输出将是AACCCDD
  • @Levi 如果 OP 更新了问题,我将进行编辑以满足该问题。对于 OP,基本上你只需将第二个字符串放在一个计数器中,循环原始字符串并在每个通过的字母上递减计数器。
  • 谢谢大家,Loïc、flakes 和 Levi!我添加了一些上下文,也应该澄清顺序对我的特定目的无关紧要。
  • @flakes 对,OP 在此期间澄清了它
【解决方案2】:

您应该看到itertools 模块中有一个filterfalse 函数。 请参阅文档here

当谓词被评估为False 时,filterfalse 函数从可迭代对象中返回元素。

因此,一种可能的解决方案可能是:

import itertools

def reduce_string(s1, s2):

    def predicate(letter, param=list(s2)):
        if letter in param:
            param.remove(letter)
            return True
        return False

    result = itertools.filterfalse(predicate, s1)

    return ''.join(result)

reduce_string("AAABBBCCCCCCD", "ABBCCC")
reduce_string("AAABBBCCCCCCD", "ABBCCCE")

但是,请注意我的 predicate 函数在更改第二个字符串时有点棘手。

当函数predicatereduce_string 范围内创建为list 对象时,会评估关键字参数param

由于引用没有改变,但 param 中的元素,我能够更改第二个字符串以进行比较。

现在,问题仍然存在:有没有更优雅的方式来定义predicate 函数?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 2011-05-25
    • 2019-07-27
    • 2013-08-22
    • 2021-06-15
    相关资源
    最近更新 更多