代码之家  ›  专栏  ›  技术社区  ›  DeeeeRoy

从列表中删除列表的重复元组

  •  3
  • DeeeeRoy  · 技术社区  · 8 年前

    我想写一个脚本来获取类别列表,并返回将类别拆分为两组的独特方法。现在我用元组形式(list\u a,list\u b),其中list\u a和list\u b的联合表示类别的完整列表。

    下面我以类别['A','B','C','D]为例,我可以得到所有的组。但是,有些是重复的(['A']、['B'、['C'、'D'])表示与(['B'、['C'、'D']、['A'])相同的拆分。如何仅保留唯一拆分?还有,这篇文章的更好标题是什么?

    import itertools
    def getCompliment(smallList, fullList):
        compliment = list()
        for item in fullList:
            if item not in smallList:
                compliment.append(item)
        return compliment
    
    optionList = ['A','B','C','D']
    combos = list()
    for r in range(1,len(optionList)):
        tuples = list(itertools.combinations(optionList, r))
        for t in tuples:
            combos.append((list(t),getCompliment(list(t), optionList)))
    
    print(combos)
    
    [(['A'], ['B', 'C', 'D']),
     (['B'], ['A', 'C', 'D']), 
     (['C'], ['A', 'B', 'D']),
     (['D'], ['A', 'B', 'C']),
     (['A', 'B'], ['C', 'D']),
     (['A', 'C'], ['B', 'D']),
     (['A', 'D'], ['B', 'C']),
     (['B', 'C'], ['A', 'D']),
     (['B', 'D'], ['A', 'C']),
     (['C', 'D'], ['A', 'B']),
     (['A', 'B', 'C'], ['D']),
     (['A', 'B', 'D'], ['C']),
     (['A', 'C', 'D'], ['B']),
     (['B', 'C', 'D'], ['A'])]
    

    我需要以下内容:

    [(['A'], ['B', 'C', 'D']),
     (['B'], ['A', 'C', 'D']), 
     (['C'], ['A', 'B', 'D']),
     (['D'], ['A', 'B', 'C']),
     (['A', 'B'], ['C', 'D']),
     (['A', 'C'], ['B', 'D']),
     (['A', 'D'], ['B', 'C'])]
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   jpp    8 年前

    你非常接近。你需要的是 set 的结果。

    自从 设置 元素必须是可散列的,并且 list 对象不可散列,您可以使用 tuple 相反这可以通过对代码进行一些微不足道的更改来实现。

    import itertools
    
    def getCompliment(smallList, fullList):
        compliment = list()
        for item in fullList:
            if item not in smallList:
                compliment.append(item)
        return tuple(compliment)
    
    optionList = ('A','B','C','D')
    combos = set()
    for r in range(1,len(optionList)):
        tuples = list(itertools.combinations(optionList, r))
        for t in tuples:
            combos.add(frozenset((tuple(t), getCompliment(tuple(t), optionList))))
    
    print(combos)
    
    {frozenset({('A',), ('B', 'C', 'D')}),
     frozenset({('A', 'C', 'D'), ('B',)}),
     frozenset({('A', 'B', 'D'), ('C',)}),
     frozenset({('A', 'B'), ('C', 'D')}),
     frozenset({('A', 'C'), ('B', 'D')}),
     frozenset({('A', 'D'), ('B', 'C')}),
     frozenset({('A', 'B', 'C'), ('D',)})}
    

    如果需要将结果转换回列表列表,可以通过列表理解:

    res = [list(map(list, i)) for i in combos]
    
    [[['A'], ['B', 'C', 'D']],
     [['B'], ['A', 'C', 'D']],
     [['A', 'B', 'D'], ['C']],
     [['A', 'B'], ['C', 'D']],
     [['B', 'D'], ['A', 'C']],
     [['B', 'C'], ['A', 'D']],
     [['A', 'B', 'C'], ['D']]]