如何获取字符串列表,使其代表给定列表中的所有字符串?

时间:2011-11-07 19:22:02

标签: python list

我有一个字符串列表。从这个列表中我想生成一个新的字符串列表,以便所有字符串都是唯一的(我知道我可以使用set来执行此操作),但是这个新列表应该是新列表中没有字符串可以是列表中任何其他字符串的子集。

EDIT 根据我收到的评论,我将尝试做出一些澄清。单词“subset”不准确,应该是 substring

4 个答案:

答案 0 :(得分:2)

我认为这应该有效:

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']

我的编辑修复了以前代码的一些问题。请注意,现在这更喜欢较短的单词。

答案 1 :(得分:2)

这个简单的代码:

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']

答案 2 :(得分:1)

我认为它确实如此:

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'和'rumunu abyetin'在前一个列表中互换,那么扣除的列表将会有'rumunu abyetin'而不是'abyet'。 为什么'abyet'被授权在第一种情况下被列入扣除列表,而不是在第二种情况下? :因为它在第一个列表中的位置。

您必须使用精确的附加条件来接受或拒绝结果列表中的字符串,因为目前在我看来,有几种组合可以从给定列表中回答您的问题

PS

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

答案 3 :(得分:1)

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

给出

set(['catamaran', 'boat', 'man'])