python - 字符串列表 - 删除常见字符串的共性

标签 python algorithm

我正在努力想出解决这个问题的方法(以及如何在 stackoverflow 上为这个问题想出一个名字)。

我需要以某种方式删除保留余数的字符串的共性。

给定如下列表:

l = ('first',
     'first.second',
     'first.second.third',
     'a.b.c',
     'x.y.z',
     'x.y') 

我希望有一个列表输出:

('first',
 'second',
 'third', 
 'a.b.c',
 'x.y',
 'z' ) 

如您所见,当 first.second 减去 first 并保持 second 时。 first.secondfirst.second.third 中减去,我们得到 thirda.b.c 没有任何东西可以从自身减去,所以它仍然存在。从 x.y.z 中减去 x.y 并保留 z

我在想也许 sort(key=len) 将成为解决方案的一部分,以及某种以字符串余数结尾的递归。我希望有一种干净的方法来删除列表中每个字符串的共性。

最佳答案

我认为您需要在编写解决方案之前更准确地定义您的问题。这是我从您的测试用例中推断出的内容:

  1. “成员”由句点分隔:同一个“成员”不能出现在两个元组项中。
  2. 每个成员只能出现一次。

但是,问题是优先级 是不明确的。例如,按照以下顺序:

lst = ('a.b.c',
       'a.b.d')

“a”和“b”属于哪里?您的测试用例意味着一个普通成员应该去拥有最少普通成员的那个(所以“z”不会留在“x.y.z”),但是有很多需要考虑的边缘情况。您需要以更准确的格式提出您的要求。

采用更简单的规则,即“成员”应保留在它出现的第一个位置,以下函数可以达到目的:

def remove_common(lst):
    seen = set()
    res = []
    for i in lst:
        members = i.split('.')
        res.append('.'.join(w for w in members if w not in seen))
        seen |= set(members)
    return tuple(res)

这给出了非常接近您的结果:

>>> remove_common(l)
('first', 'second', 'third', 'a.b.c', 'x.y.z', '')

关于python - 字符串列表 - 删除常见字符串的共性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39963368/

相关文章:

python - 将元素保留在列表中,其数字加起来等于某个值

python - 在 Python 中的 Google App Engine 中提交表单后显示

python - 已安装 django-axes,但 axes.middleware 模块不可用

algorithm - 模拟退火中T代表什么?

algorithm - 计算窗框(修剪)的有效使用

c++ - 关于行进立方体算法的说明

python - 在 Python 中执行 VLOOKUP 没有给出正确的结果

python - 如何判断 InstrumentedAttribute 是否是 sqlalchemy 中的关系?

algorithm - RSA token 如何工作?

algorithm - 能被数字 M 整除的最短数字