查找列表的多个子集或多个列表的单个超集

时间:2018-06-29 07:00:46

标签: python

我有一个包含1到n个元素的列表。列表对象是:

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

例如

  • ['Market J']是以下内容的子集:
  • ['Market J', 'Competitor A']是以下子集:
  • ['Market J', 'Competitor A', 'FR Y']还是以下子集:
  • ['Market J', 'Competitor A', 'FR Y', 'BR I'],这是以下内容的子集:
  • ['Market J', 'Competitor A', 'FR Y', 'BR I', 'SBR AJ']

相反,每个都是后者的超集。

我想做的是以字典的形式显示这种关系:

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

(其中键是我列表中的元素,但不包括会包含在另一个键的值中的键,例如"['Market J']"是键,而"['Market J', 'Competitor A']"则不是。)

或更好的数据结构(如果可以建议的话)。我会发布一个代码片段,但我想不出一种最佳的方法。

1 个答案:

答案 0 :(得分:4)

您可以使用字典理解:

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