我正在努力想出解决这个问题的方法(以及如何在 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.second
从 first.second.third
中减去,我们得到 third
。 a.b.c
没有任何东西可以从自身减去,所以它仍然存在。从 x.y.z
中减去 x.y
并保留 z
。
我在想也许 sort(key=len)
将成为解决方案的一部分,以及某种以字符串余数结尾的递归。我希望有一种干净的方法来删除列表中每个字符串的共性。
最佳答案
我认为您需要在编写解决方案之前更准确地定义您的问题。这是我从您的测试用例中推断出的内容:
- “成员”由句点分隔:同一个“成员”不能出现在两个元组项中。
- 每个成员只能出现一次。
但是,问题是优先级 是不明确的。例如,按照以下顺序:
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/