【问题标题】:Deleting Duplicate Tuples of Lists from List从列表中删除重复的列表元组
【发布时间】:2018-10-17 10:43:00
【问题描述】:

我想编写一个脚本来获取类别列表并返回将类别分成两组的独特方式。现在我有它的元组形式 (list_a, list_b),其中 list_a 和 list_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'])]

【问题讨论】:

    标签: python python-3.x list tuples unique


    【解决方案1】:

    你很亲密。您需要的是set 的结果。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多