Python 如何检查子列表是否具有相同的字符串元素,而不考虑顺序,并且只在另一个列表中放置一次子列表

Python 如何检查子列表是否具有相同的字符串元素,而不考虑顺序,并且只在另一个列表中放置一次子列表,python,list,compare,sublist,Python,List,Compare,Sublist,我有一个每学期的课程列表,如下所示: [[['CS105', 'ENG101', 'MATH101', 'GER'], ['ENG102', 'CS230', 'MATH120', 'GER'], ['CS205', 'FREE'], ['GER'], ['CS106', 'CS215', 'CS107', 'ENG204'], ['GER', 'MATH220', 'CS300', 'CS206'], ['CS306', 'GER'], ['FREE'], ['CS312', 'CS450',

我有一个每学期的课程列表,如下所示:

[[['CS105', 'ENG101', 'MATH101', 'GER'], ['ENG102', 'CS230', 'MATH120', 'GER'], ['CS205', 'FREE'], ['GER'], ['CS106', 'CS215', 'CS107', 'ENG204'], ['GER', 'MATH220', 'CS300', 'CS206'], ['CS306', 'GER'], ['FREE'], ['CS312', 'CS450', 'GER', 'CS321', 'FREE'], ['CS325', 'GER', 'CS322', 'MAJOR'], ['CS310', 'STAT205'], [''], ['CS443', 'CS412', 'CS421', 'GER'], ['CS444', 'FREE', 'FREE', ''], ['', '']], [['CS105', 'ENG101', 'MATH101', 'GER'], ['ENG102', 'CS230', 'MATH120', 'GER'], ['CS205', 'FREE'], ['GER'], ['CS106', 'CS215', 'CS107', 'ENG204'], ['GER', 'MATH220', 'CS300', 'CS206'], ['CS306', 'GER'], ['FREE'], ['CS312', 'CS450', 'GER', 'CS321', 'FREE'], ['CS325', 'GER', 'CS322', 'MAJOR'], ['CS310', 'STAT205'], [''], ['CS443', 'CS412', 'CS421', 'GER'], ['CS444', 'FREE', 'FREE', ''], ['', '']], [['CS105', 'ENG101', 'MATH101', 'GER'], ['ENG102', 'CS230', 'MATH120', 'GER'], ['CS205', 'FREE'], ['GER'], ['CS106', 'CS215', 'CS107', 'ENG204'], ['GER', 'MATH220', 'CS300', 'CS206'], ['CS306', 'GER'], ['FREE'], ['CS312', 'CS450', 'GER', 'CS321', 'FREE'], ['CS325', 'GER', 'CS322', 'MAJOR'], ['CS310', 'STAT205'], [''], ['CS443', 'CS412', 'CS421', 'GER'], ['CS444', 'FREE', 'FREE', ''], ['', '']], [['CS105', 'ENG101', 'MATH101', 'GER'], ['ENG102', 'CS230', 'MATH120', 'GER'], ['CS205', 'FREE'], ['GER'], ['CS106', 'CS215', 'CS107', 'ENG204'], ['GER', 'MATH220', 'CS300', 'CS206'], ['CS306', 'GER'], ['FREE'], ['CS312', 'CS450', 'GER', 'CS321', 'FREE'], ['CS325', 'GER', 'CS322', 'MAJOR'], ['CS310', 'STAT205'], [''], ['CS443', 'CS412', 'CS421', 'GER'], ['CS444', 'FREE', 'FREE', ''], ['', '']], [['CS105', 'ENG101', 'GER', 'GER'], ['ENG102', 'CS230', 'MATH120', 'GER'], ['CS205', 'FREE'], ['GER'], ['CS106', 'CS215', 'CS107', 'ENG204'], ['GER', 'MATH220', 'CS300', 'CS206'], ['CS306', 'GER'], ['FREE'], ['CS312', 'CS450', 'GER', 'CS321', 'FREE'], ['CS325', 'GER', 'CS322', 'MAJOR'], ['CS310', 'STAT205'], [''], ['CS443', 'CS412', 'CS421', 'GER'], ['CS444', 'FREE', 'FREE', ''], ['', '']],...]
因此,每个列表是学生毕业前的课程路径,每个子列表是每个学生所修课程的组合。我有1500名学生,我想创建一个包含每个子列表的所有唯一组合的新列表。更准确地说,我想检查例如每学期课程[0][0]是否与每学期课程[1][0]、每学期课程[2][0]、…、每学期课程[1500][0]相同。然后对每个列表的第二个子列表执行相同的操作。每次代码找到一个唯一的子列表时,我都希望将该组合放入一个新列表中,例如第一个子列表\u组合。但是<>强>最重要的< /强>是,如果一个学生有这个强组合[CS105,'En101','Math101','Ge'')和另一个学生[CS105','Math101','Ge'','En101' ],那么我希望代码考虑它们相同的< /强>。不要把它们放在不同的地方。所以我不喜欢这个订单。因此,第一个子列表组合将只使用['CS105',ENG101',MATH101',GER']一次['CS105',ENG101',MATH101',GER']['CS105',MATH101',GER',ENG101']

我没有找到这样做的方法。我试着做集合,但集合只接受唯一的值,在一些列表中,我有超过1个空项,它接受1个我无法接受的值

我试图做的是:

for i in range(0,len(courses_per_semester)-1):
    for j in range(i,len(courses_per_semester[i])):
        if courses_per_semester[i][j]==courses_per_semester[i+1][j]:
             first_sublist_combinations.append(courses_per_semester[i][j])
但它不起作用,因为我可能没有以正确的方式思考它。 我还将列表转换为一个集合

course_sets_per_semester = [[set(courses_per_semester) for courses_per_semester in sublist] for sublist in courses_per_semester]
但像这样,它只给我一次字符串,即使它在一个子列表中是两次,所以即使我想,我也不能正确地比较它们,因为当一个子列表的长度被认为是相同的时候,它的长度会比另一个子列表的长度小


例如,第一个子列表组合=[[CS105]、[MATH101]、[GER]、[ENG101]、[CS105]、[MATH101]、[GER]、[GER]、[GER]、[GER]、[GER]、[GER]、[GER]、[p>假设
x
是您的输入列表:

res=list(map(lambda c:list(set(c)),zip(*map(lambda:list)(map(lambda:tuple(sorted(b)),a)),x)))
根据您的示例输出:

[('CS105','ENG101','GER','MATH101'),[('CS230','ENG102','GER','MATH120'),[('CS205','FREE'),[('GER',),[('CS106','CS107','CS215','ENG204'),[('CS206','CS300','GER','MATH220'),[('CS306','GER'),[('FREE',),[('CS312','CS321','CS450','FREE','GER','GER'),[('CS322','CS325','GER','gers'),[('CS310','t205','],[('CS412','CS421','CS443','GER'),[('CS444','FREE','FREE'),[('','')]

请分享您的研究和代码,并重新格式化您的问题,使其可读。我现在分享了我所想到的一切,但我找不到一种方法来提供正确的代码。这就是为什么我从一开始就没有提供代码@西蒙尼没有得到结果。我需要的是每次在一个新的列表中放置每个列表的第一个子列表的唯一组合(没有顺序问题)。然后在另一个新列表中,每个列表的第二个子列表也是如此。你的意思是像每个子列表一样,你只想过滤掉唯一的值?所以从
[arr1,arr2,arr3]
[unique(arr1),unique(arr2),unique(arr3)]
?例如,一个列表的第一个子列表是['CS105','ENG101','GER','MATH101']。另一个列表的第一个子列表可能是['CS105','GER','MATH101','ENG101'],而另一个列表的第一个子列表可能是['CS105','GER','GER','ENG101']。因此,我想检查每个列表的第一个子列表,然后将它们放入一个名为first_sublist_combinations=[[CS105]、[ENG101]、[GER]、[CS105]、[GER]、[GER]、[GER]、[GER]、[GER]、[ENG101]、[CS105]、[ENG101]、[GER]、[MATH101]、[ENG101]的新列表中都是相同的项目。请立即尝试-结果的第一个子列表指的是第一个项目、第二个到第二个项目、第三个到第三个项目等等…它起作用了!!非常感谢你@Grzegorz。因为我是python新手,所以我看到的结果在括号中。这是否意味着它们是arrayes/子列表或集合?如果我的问题不是那么聪明,我很抱歉。