pissall
pissall

Reputation: 7399

Finding multiple subsets of lists or single superset of multiple lists

I have a list which contains 1 to n elements. The list object is :

[['Market F', 'Others', 'FR A', 'BR A', 'SBR A'], 
['Market J', 'Competitor A', 'FR Y', 'BR I', 'SBR AJ'], 
['Market L', 'Others', 'FR Q', 'BR A', 'SBR A'], 
['Market M', 'Others', 'FR G', 'BR B', 'SBR B'], 
['Market N', 'My Company', 'FR W', 'BR D', 'SBR H'], 
['Market TT', 'Others', 'FR Q', 'BR A', 'SBR A'], 
['Market U', 'Others', 'FR Q', 'BR A', 'SBR A'], 
['Market F', 'Others', 'FR A', 'BR A'], 
['Market J', 'Competitor A', 'FR Y', 'BR I'], 
['Market L', 'Others', 'FR Q', 'BR A'], 
['Market M', 'Others', 'FR G', 'BR B'], 
['Market TT', 'Others', 'FR Q', 'BR A'], 
['Market U', 'Others', 'FR Q', 'BR A'], 
['Market F', 'Others', 'FR A'], 
['Market J', 'Competitor A', 'FR Y'], 
['Market L', 'Others', 'FR Q'], 
['Market M', 'Others', 'FR G'], 
['Market TT', 'Others', 'FR Q'], 
['Market U', 'Others', 'FR Q'], 
['Market F', 'Others'], 
['Market J', 'Competitor A'], 
['Market J']]

For e.g.

In the reverse order, each is a superset of the latter.

What I would like to do is show that relation in the form of a dictionary like:

{"['Market J']": [
    ['Market J', 'Competitor A'],
    ['Market J', 'Competitor A', 'FR Y'],
    ['Market J', 'Competitor A', 'FR Y', 'BR I']
]}

(Where the keys are the elements of my list excluding keys which themselves would be contained in the value of another key e.g. "['Market J']" would be a key but "['Market J', 'Competitor A']" would not.)

or a better data structure if you could suggest. I would post a code-snippet but I can't think of an optimal way to do it.

Upvotes: 1

Views: 111

Answers (1)

iacob
iacob

Reputation: 24181

You could use a dictionary comprehension:

l = [...]

# Dictionary keys must be immutable
l = [tuple(x) for x in l]

# Taking only proper subsets
d = {key: [match for match in l if set(key).issubset(match)  and not 
                                   set(match).issubset(key)] for key in l}

# Removing keys with no supersets
d = {k:v for k, v in d.items() if v}

# Removing keys which are supersets of other keys
d = {k:v for k, v in d.items() if k not in [item for sublist in d.values() 
                                                       for item in sublist]}

print(d)
>>>{('Market TT', 'Others', 'FR Q'): [('Market TT', 'Others', 'FR Q', 'BR A', 'SBR A'), ('Market TT', 'Others', 'FR Q', 'BR A')], 
    ('Market L', 'Others', 'FR Q'): [('Market L', 'Others', 'FR Q', 'BR A', 'SBR A'), ('Market L', 'Others', 'FR Q', 'BR A')], 
    ('Market M', 'Others', 'FR G'): [('Market M', 'Others', 'FR G', 'BR B', 'SBR B'), ('Market M', 'Others', 'FR G', 'BR B')], 
    ('Market U', 'Others', 'FR Q'): [('Market U', 'Others', 'FR Q', 'BR A', 'SBR A'), ('Market U', 'Others', 'FR Q', 'BR A')], 
    ('Market F', 'Others'): [('Market F', 'Others', 'FR A', 'BR A', 'SBR A'), ('Market F', 'Others', 'FR A', 'BR A'), ('Market F', 'Others', 'FR A')], 
    ('Market J',): [('Market J', 'Competitor A', 'FR Y', 'BR I', 'SBR AJ'), ('Market J', 'Competitor A', 'FR Y', 'BR I'), ('Market J', 'Competitor A', 'FR Y'), ('Market J', 'Competitor A')]}

Upvotes: 3

Related Questions