Python 如何获得一个字符串列表,使其表示给定列表中的所有字符串?

Python 如何获得一个字符串列表,使其表示给定列表中的所有字符串?,python,list,Python,List,我有一个字符串列表。从这个列表中,我想生成一个新的字符串列表,这样所有的字符串都是唯一的(我知道我可以使用set来实现这一点),但是这个新列表应该是这样的:新列表中的任何字符串都不能是列表中任何其他字符串的子集 编辑 从我收到的评论中,我将试图提出一些澄清。“subset”一词不准确,它应该是substring。我认为它做到了: li = [ 'abcd', 'abyet', 'abcd betry', 'outry', 'rumunu a

我有一个字符串列表。从这个列表中,我想生成一个新的字符串列表,这样所有的字符串都是唯一的(我知道我可以使用
set
来实现这一点),但是这个新列表应该是这样的:新列表中的任何字符串都不能是列表中任何其他字符串的子集

编辑 从我收到的评论中,我将试图提出一些澄清。“subset”一词不准确,它应该是substring。

我认为它做到了:

li = [ 'abcd',
       'abyet',
       'abcd betry',
       'outry',
       'rumunu abyetin',
       'takama eli',
       'com betry',
       'rumunu',
       'foutrym']


la = []
for x in li:
    if not any(x in el or el in x for el in la):
        la.append(x)

print li
print
print la
结果

['abcd', 'abyet', 'abcd betry', 'outry', 'rumunu abyetin', 'takama eli', 'com betry', 'rumunu', 'foutrym']

['abcd', 'abyet', 'outry', 'takama eli', 'com betry', 'rumunu']
PS

但是,如果在前一个列表中“阿卜耶特”和“鲁穆努·阿卜耶丁”互换,则扣除的列表将有“鲁穆努·阿卜耶丁”而不是“阿卜耶特”。
为什么在第一种情况下“abyet”被授权在扣除清单中,而在第二种情况下不被授权因为它在第一个列表中的位置

您必须精确地确定其他标准,以接受或拒绝结果列表中的字符串,因为在我看来,目前有几种组合可以从给定列表中回答您的问题

附言 我的这个答案显然不值得投票。
请upvoter删除他的upvote

我认为它做到了:

li = [ 'abcd',
       'abyet',
       'abcd betry',
       'outry',
       'rumunu abyetin',
       'takama eli',
       'com betry',
       'rumunu',
       'foutrym']


la = []
for x in li:
    if not any(x in el or el in x for el in la):
        la.append(x)

print li
print
print la
结果

['abcd', 'abyet', 'abcd betry', 'outry', 'rumunu abyetin', 'takama eli', 'com betry', 'rumunu', 'foutrym']

['abcd', 'abyet', 'outry', 'takama eli', 'com betry', 'rumunu']
PS

但是,如果在前一个列表中“阿卜耶特”和“鲁穆努·阿卜耶丁”互换,则扣除的列表将有“鲁穆努·阿卜耶丁”而不是“阿卜耶特”。
为什么在第一种情况下“abyet”被授权在扣除清单中,而在第二种情况下不被授权因为它在第一个列表中的位置

您必须精确地确定其他标准,以接受或拒绝结果列表中的字符串,因为在我看来,目前有几种组合可以从给定列表中回答您的问题

附言 我的这个答案显然不值得投票。

请upvoter删除他的upvote

我认为这应该有效:

def unique_sublist(lst):
    sorted_lst = sorted(lst, key=len, reverse=True)
    subs = set()
    result = []
    for s in sorted_lst:
        if s not in subs:
            subs.update(s[i:j] for i in range(0, len(s))
                        for j in range(i+1, len(s)+1))
            result.append(s)
    return sorted(result, key=lst.index)

>>> unique_sublist(['a', 'man', 'ran', 'at', 'a', 'catamaran', 'boat'])
['man', 'catamaran', 'boat']

>>> unique_sublist(['abcd', 'abyet', 'abcd betry', 'outry', 'rumunu abyetin', 'takama eli', 'com betry', 'rumunu', 'foutrym'])
['abcd betry', 'rumunu abyetin', 'takama eli', 'com betry', 'foutrym']

我的编辑修复了前面代码的一些问题。请注意,现在它更喜欢较长的单词而不是较短的单词。

我认为这应该是可行的:

def unique_sublist(lst):
    sorted_lst = sorted(lst, key=len, reverse=True)
    subs = set()
    result = []
    for s in sorted_lst:
        if s not in subs:
            subs.update(s[i:j] for i in range(0, len(s))
                        for j in range(i+1, len(s)+1))
            result.append(s)
    return sorted(result, key=lst.index)

>>> unique_sublist(['a', 'man', 'ran', 'at', 'a', 'catamaran', 'boat'])
['man', 'catamaran', 'boat']

>>> unique_sublist(['abcd', 'abyet', 'abcd betry', 'outry', 'rumunu abyetin', 'takama eli', 'com betry', 'rumunu', 'foutrym'])
['abcd betry', 'rumunu abyetin', 'takama eli', 'com betry', 'foutrym']
alist = ['a', 'man', 'ran', 'at', 'a', 'catamaran', 'boat']
result = set()
for word1 in alist:
    if word1 in result:
        continue # shortcut for performance reasons only
    to_remove = []
    for word2 in result:
        if word1 in word2:
            break
        if word2 in word1:
            to_remove.append(word2)
    else:
        result.add(word1)
    for word in to_remove:
        result.remove(word)
print result
我的编辑修复了前面代码的一些问题。请注意,现在它更喜欢较长的单词而不是较短的单词

alist = ['a', 'man', 'ran', 'at', 'a', 'catamaran', 'boat']
result = set()
for word1 in alist:
    if word1 in result:
        continue # shortcut for performance reasons only
    to_remove = []
    for word2 in result:
        if word1 in word2:
            break
        if word2 in word1:
            to_remove.append(word2)
    else:
        result.add(word1)
    for word in to_remove:
        result.remove(word)
print result
给予

给予

这个简单的代码:

def funky(alist):
    result = []
    for s in sorted(alist, key=len, reverse=True):
        if not any(s in item for item in result):
            result.append(s)
    return result # no ordering requirement was specified

print funky(['a', 'man', 'ran', 'at', 'a', 'catamaran', 'boat'])
print funky(['abcd', 'abyet', 'abcd betry', 'outry', 'rumunu abyetin', 'takama eli', 'com betry', 'rumunu', 'foutrym'])
产生:

['catamaran', 'boat', 'man']
['rumunu abyetin', 'abcd betry', 'takama eli', 'com betry', 'foutrym']
这个简单的代码:

def funky(alist):
    result = []
    for s in sorted(alist, key=len, reverse=True):
        if not any(s in item for item in result):
            result.append(s)
    return result # no ordering requirement was specified

print funky(['a', 'man', 'ran', 'at', 'a', 'catamaran', 'boat'])
print funky(['abcd', 'abyet', 'abcd betry', 'outry', 'rumunu abyetin', 'takama eli', 'com betry', 'rumunu', 'foutrym'])
产生:

['catamaran', 'boat', 'man']
['rumunu abyetin', 'abcd betry', 'takama eli', 'com betry', 'foutrym']


这将是非常昂贵的计算。请给出这样一个清单。我同意。计算能力没有限制。但我不明白该怎么做。在字符串上下文中如何定义子集?你是说子串吗?或者单词的子集?那么从字符串列表a中,你想创建一个字符串列表B,该列表B是唯一的,并且a中没有B元素?这在计算上非常昂贵。请给出这样一个列表。我同意。计算能力没有限制。但我不明白该怎么做。在字符串上下文中如何定义子集?你是说子串吗?或者单词的子集?那么从字符串列表a中,你想创建一个字符串列表B,该列表B是唯一的,并且a中没有B元素?我对这个问题的解释是,
'abcd-betry'
应该在
'abcd'
@Steven中幸存下来,我不这么认为。如果'abcd'和'abcd-betry'仍然保留在完整的结果列表中,将有一个字符串'abcd',它将是另一个字符串'abcd-betry'的子字符串,这与“新列表中的任何字符串都不能是列表中任何其他字符串的子集”相反@eqyuem:这对我来说意味着,一旦遇到'abcd-betry',您将删除'abcd'。史蒂文:是的,您是对的。这意味着,在处理字符串'abcd betry'时,我的代码缺少从la中删除'abcd'。但事实是,我在回答中得到的列表la符合问题的要求,我相信。然后我更认为没有足够的标准来获得一个唯一的列表。目前,按照问题的措辞,似乎可以将起始列表中的元素组合在一起。在他的回答中,FJ Subreptive在这个问题片段中引入了一个额外的标准“新列表中的任何字符串都不能是列表中任何其他字符串的子集”什么是“列表”的先行项?是新名单还是原来的名单?我认为是原来的名单,你认为是新的名单。这就是为什么我最初的评论说“我的解释…”。我对这个问题的解释是,
'abcd-betry'
应该在
'abcd'
@Steven我不这么认为。如果'abcd'和'abcd-betry'仍保留在完整的结果列表中,那么就会有一个字符串'abcd',这将是另一个字符串“abcd-betry”的子字符串,这与“新列表中的任何字符串都不能是列表中任何其他字符串的子集”相反@eqyuem:这对我来说意味着,一旦遇到“abcd-betry”,您将删除“abcd”。@Steven哦,是的,您是对的。这意味着,在处理字符串'abcd betry'时,我的代码缺少从la中删除'abcd'。但事实是,我在回答中得到的列表la符合问题的要求,我相信。然后我更认为没有足够的标准来获得一个唯一的列表。目前,按照问题的措辞,似乎可以将起始列表中的元素组合在一起。在他的回答中,FJ Subreptive在这个问题片段中引入了一个额外的标准“新列表中的任何字符串都不能是列表中任何其他字符串的子集”什么是“列表”的先行项?是新名单还是原来的名单?我认为是原来的名单,你认为是新的名单。这就是为什么我最初的评论说“我的解释……”好吧。但是使用排序子类会引入额外的条件。根据问题中的措辞,清单[‘人’、‘跑’、‘船’]是有效的。为什么“双体船”被授权在你身上