Python - 从作为另一个元素的子字符串的字符串列表中删除任何元素

时间:2014-02-12 06:21:13

标签: python string list substring

首先从字符串列表开始,如下所示

  

string_list = ['休息','休息','看','看','它','吐']

我想从列表中删除另一个元素的子字符串中的任何元素,例如给出结果......

  

string_list = ['休息','看','吐']

我有一些代码可以实现这一点,但它令人尴尬的丑陋,可能是不必要的复杂。在Python中有一种简单的方法吗?

8 个答案:

答案 0 :(得分:8)

第一个构建块:substring。

您可以使用in来检查:

>>> 'rest' in 'resting'
True
>>> 'sing' in 'resting'
False

接下来,我们将选择创建新列表的天真方法。我们将逐个添加项目到新列表中,检查它们是否是子字符串。

def substringSieve(string_list):
    out = []
    for s in string_list:
        if not any([s in r for r in string_list if s != r]):
            out.append(s)
    return out

您可以通过排序来减少比较次数(毕竟,较长的字符串永远不能是较短/相等长度字符串的子字符串):

def substringSieve(string_list):
    string_list.sort(key=lambda s: len(s), reverse=True)
    out = []
    for s in string_list:
        if not any([s in o for o in out]):
            out.append(s)
    return out

答案 1 :(得分:3)

这是一个可能的解决方案:

string_list = ['rest', 'resting', 'look', 'looked', 'it', 'spit']
def string_set(string_list):
    return set(i for i in string_list 
               if not any(i in s for s in string_list if i != s))

print(string_set(string_list))

打印出来:

set(['looked', 'resting', 'spit'])

注意我创建一个集合(使用生成器表达式)来删除可能重复的单词,因为看起来顺序无关紧要。

答案 2 :(得分:2)

另一个班轮:

[string for string in string_list if len(filter(lambda x: string in x,string_list)) == 1]

应该是相当可读的,而不是pythonic。

答案 3 :(得分:0)

这是一种方法:

def find_unique(original):
    output = []

    for a in original:
        for b in original:
            if a == b:
                continue     # So we don't compare a string against itself
            elif a in b:
                break
        else:
            output.append(a) # Executed only if "break" is never hit

    return output

if __name__ == '__main__':
    original = ['rest', 'resting', 'look', 'looked', 'it', 'split']
    print find_unique(original)

它利用了这样一个事实:我们可以使用in运算符轻松检查一个字符串是否是另一个字符串的子字符串。它基本上遍历每个字符串,检查它是否是另一个字符串的子字符串,如果不是则将其自身附加到输出列表。

打印出['resting', 'looked', 'split']

答案 4 :(得分:0)

这是一个符合你想要的单线:

filter(lambda x: [x for i in string_list if x in i and x != i] == [], string_list)

示例:

>>> string_list = ['rest', 'resting', 'look', 'looked', 'it', 'spit']
>>> filter(lambda x: [x for i in string_list if x in i and x != i] == [], string_list)
['resting', 'looked', 'spit']

答案 5 :(得分:0)

这是一种不理想的方式,只有在列表很小的情况下才会使用:

for str1 in string_list:
    for str2 in string_list:
        if str1 in str2:
            string_list.remove(str1)

答案 6 :(得分:0)

这是有效的方法(相对于上述解决方案;)),因为这种方法大大减少了列表元素之间的比较次数。如果我有一个巨大的列表,我肯定会采用这个,当然你可以将这个解决方案变成一个lambda函数,使它看起来很小:

string_list = ['rest', 'resting', 'look', 'looked', 'it', 'spit']
for item in string_list: 
  for item1 in string_list:
    if item in item1 and item!= item1:
      string_list.remove(item)

print string_list

输出:

>>>['resting', 'looked', 'spit']

希望它有所帮助!

答案 7 :(得分:-1)

这是另一种方法。假设您有一个排序列表,并且您不必在原地进行筛选,我们可以在一次通过中选择最长的字符串:

string_list = sorted(string_list)
sieved = []
for i in range(len(string_list) - 1):
    if string_list[i] not in string_list[i+1]:
        sieved.append(string_list[i])