Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从列表中删除列表的重复元组_Python_Python 3.x_List_Tuples_Unique - Fatal编程技术网

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

Python 从列表中删除列表的重复元组,python,python-3.x,list,tuples,unique,Python,Python 3.x,List,Tuples,Unique,我想写一个脚本来获取类别列表,并返回将类别分成两组的独特方法。现在我用元组形式(list_a,list_b)表示它,其中list_a和list_b的并集表示类别的完整列表 下面我用一个类别为['A'、'B'、'C'、'D']的例子来展示,我可以得到所有的组。但是,有些是重复的(['A'],['B','C','D'])表示与(['B','C','D'],['A'])相同的分割。如何仅保留唯一拆分?还有,这篇文章的更好标题是什么 import itertools def getCompliment(

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

你很接近。您需要的是一组结果

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

非常感谢。这太棒了!