Remove a string that is a substring of other string in the list WITHOUT changing original order of the list
<p>I have a list.</p>

<pre><code>the_list = ['Donald Trump has', 'Donald Trump has small fingers', 'What is going on?']
</code></pre>

<p>I'd like to remove "Donald Trump has" from <code>the_list</code> because it's a substring of other list element.</p>

<p>Here is an important part. I want to do this without distoring the order of the original list.</p>

<p>The function I have (below)  distorts the order of the original list. Because it sorts the list items by its length first. </p>

<pre><code>def substr_sieve(list_of_strings):  
    dups_removed = list_of_strings[:]
    for i in xrange(len(list_of_strings)):
        list_of_strings.sort(key = lambda s: len(s))
        j=0
        j=i+1
        while j &lt;= len(list_of_strings)-1:
            if list_of_strings[i] in list_of_strings[j]:
                try:
                    dups_removed.remove(list_of_strings[i])
                except:
                    pass
            j+=1
    return dups_removed
</code></pre>

<p>You can do this without sorting:</p>

<pre><code>the_list = ['Donald Trump has', "I've heard Donald Trump has small fingers",
            'What is going on?']

def winnow(a_list):
    keep = set()
    for item in a_list:
        if not any(item in other for other in a_list if item != other):
            keep.add(item)
    return [ item for item in a_list if item in keep ]

winnow(the_list)
</code></pre>

<p>Sorting may allow fewer comparisons overall, but that seems highly data-dependent, and could be a premature optimization.</p>

python string list