python - 我怎样才能唯一地缩短字符串列表,使它们最多 x 个字符长

标签 python string algorithm language-agnostic abbreviation

我正在寻找一种算法,该算法将采用字符串向量 v1 并返回类似的字符串向量 v2,其中每个字符串都小于 x 字符长且唯一。 v1 中的字符串可能不是唯一的。

虽然我需要在 v1 中接受 ASCII,但我更愿意在插入新的时只插入字母数字字符 ([A-Za-z0-9])字符是必需的。

显然这里有三个警告:

  1. 对于 v1x 的某些值,不可能有唯一的 v2。例如,当 v1 有 37 个元素且 x == 1 时。

  2. 问题中指定的“类似”是主观的。这些字符串将面向用户,并且可能是简短的自然语言短语(例如“颜色数”)。我希望人们能够尽可能轻松地将原始字符串映射到缩短的字符串。这可能意味着利用启发式方法,例如 disemvoweling .因为我的相似性构造可能没有客观的衡量标准(字符串距离在这里可能不是最有用的,尽管它可能)我对什么是好的判断将是任意的。该方法应适用于英语 - 其他语言无关。

显然这是一个(编程)语言不可知的问题,但我更看好 python 中的实现(因为我发现它的字符串处理语言很直接)。

最佳答案

关于在 python 中执行此操作的一些注意事项/提示。

  1. 使用bisect module保留您的结果数组,以便轻松发现潜在的非唯一性。即使 v1 已经排序(例如,nameenemy 将在取消元音化后发生冲突)
  2. 也很有用
  3. 可以通过简单地在字符串上调用 .translate(None, "aeiouyAEIOUY") 来实现去除元音。
  4. 如果出现重复,您可以首先尝试通过将所有结果小写并使用交换大小写作为“位掩码”来解决冲突,即多次出现的 aaa 变为 ["aaa", "aaA", "aAa", "aAA"] 等,如果从末尾开始“递增”字符不够,直到找到非冲突标识符,例如。 ["aa"]*7 会变成 ["aa", "aA", "Aa", "AA", "ab", "aB", "Ab"]

关于python - 我怎样才能唯一地缩短字符串列表,使它们最多 x 个字符长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9971655/

相关文章:

python - 毒性 0% 覆盖率

python - 为什么导入 cupy 时会出现 ModuleNotFoundError 错误?

javascript - 用于计算特定事件的正则表达式模式

algorithm - 在优化中找到所有可能的次优(不是最优!!!)解决方案

algorithm - 如何使用 random()={0..1} 在保持均匀性和密度的情况下生成任意范围内的数字?

java - 将 SIFT 用于增强现实

python - 核心转储 : Extract all the global variables , 核心转储中的数据结构和子结构

python - 动量反向传播

string - Hackerrank `super-functional-strings` 因超时而终止

Python:千位分隔符 - 旧格式语法