检查列表元素是否是同一列表中其他列表元素的子元素

时间:2019-05-21 18:49:03

标签: python list

我正在寻找一种方法来检查列表中的元素是否是同一列表中其他元素的子元素?

例如,让我们以下面的列表为例。

@NgModule({
  declarations: [
    AppComponent,
    ControlErrorsDirective,
    ControlErrorContainerDirective,
    FormSubmitDirective,
    ControlErrorComponent
  ],
  entryComponents: [
    ControlErrorComponent
  ],

此列表的第二和第三元素是列表的第一元素的子元素。

我正在寻找一种从列表中删除这些元素的方法,以便仅保留第一个元素。我一直在转动车轮,无法提出解决方案。

有人可以帮忙吗?

谢谢

4 个答案:

答案 0 :(得分:2)

这是一个缓慢的解决方案,可能会被接受,具体取决于您的数据大小:

lst = ['Lebron James', 'Lebron', 'James']
[s for s in lst if not any(s in s2.split() for s2 in lst if s != s2)]

答案 1 :(得分:1)

使用比赛的起点和终点而不是字符串本身,这绝对是一个更容易解决的问题。

一种方法可以是将所有范围从最大到最小,然后反向工作,并根据需要创建结果,前提是一个范围未完全包含在另一个范围内。

lst = [(0, 10),(0, 4),(5, 10)]

result = []

def memebership(big_range, small_range):
    '''return true if big_range fully contains the small_range.
    where both are tuples with a start and end value.
    '''
    if small_range[0] >= big_range[0] and small_range[1] <= big_range[1]:
        return True
    return False

for range_ in sorted(lst, key= lambda x: x[1] - x[0], reverse=True):
    if not any(memebership(x, range_) for x in result):
        result.append(range_)

print(result)
#[(0, 10)]

编辑:此答案是对OP'S编辑的问题的答复,此问题似乎已经回滚了。那好吧。希望无论如何能帮助到人。

答案 2 :(得分:0)

可以尝试创建按元素的字数分组的所有排列的字典(排列,子列表或其他选择,取决于所需的行为):

import re
import itertools
from collections import defaultdict

lst = [
    'Lebron Raymone James', 'Lebron Raymone', 
    'James', "Le", "Lebron James", 
    'Lebron James 1 2 3', 'Lebron James 1 2'
]

d = defaultdict(dict)
g = "\\b\w+\\b"

for x in lst:
    words = re.findall(g, x)  # could simply use x.split() if have just spaces
    combos = [
        x for i in range(1, len(words) + 1)
        for x in list(itertools.permutations(words, i))
    ]
    for c in combos:
        d[len(words)][tuple(c)] = True

,只取单词数量在所有组中都不存在的元素:

M = max(d) 
res = []
for x in lst:
    words = tuple(re.findall(g, x))
    if not any(d[i].get(words) for i in range(len(words)+1, M+1)):
        res.append(x)
set(res)
# {'Le', 'Lebron James 1 2 3', 'Lebron Raymone James'}

答案 3 :(得分:-3)

创建一个包含所有单词(多个单词)的集合。然后遍历列表,测试字符串以查看它们是否在集合中。

wordset = set()
lst = ['Lebron James', 'Lebron', 'James']
for s in lst:
    if " " in s:
        wordset.update(s.split())
result = [x for x in lst if x not in wordset]