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

How to check if sublists have same string elements regardless of order and place the sublist only once in another list

我有一个列表 courses_per_semester,如下所示:

[[['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 名学生,我想创建一个包含每个子列表的所有唯一组合的新列表。更准确地说,如果例如 courses_per_semester[0][0] 与 courses_per_semester[1][0 相同,我想 check ],courses_per_semester[2][0] ,...,courses_per_semester[1500][0]。然后对每个列表的第二个子列表执行相同的操作。每次代码找到一个唯一的子列表时,我希望将组合放入一个新列表中,例如 first_sublist_combinations。但是最重要的是如果一个学生有这个组合['CS105','ENG101','MATH101','GER'] 和另一个学生这个 ['CS105', 'MATH101', 'GER','ENG101'] 然后我希望代码将它们视为 相同。不要将它们视为不同。所以我不关心顺序。所以 first_sublist_combination 将采用 ['CS105'、'ENG101'、'MATH101'、'GER'] once and not ['CS105', 'ENG101', 'MATH101', 'GER'] AND ['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]

但是像这样它只给我一次字符串,即使它在子列表中有两次,所以即使我想我也无法正确比较它们,因为一个子列表的长度在它们应该是的时候变得比另一个更小相同的。

例如first_sublist_combinations=[['CS105','MATH101','GER','ENG101'],['CS105','MATH101','GER','GER'],..]

假设 x 是您的输入列表:

res=list(map(lambda c: list(set(c)), zip(*map(lambda a: list(map(lambda b: 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')], [('CS322', 'CS325', 'GER', 'MAJOR')], [('CS310', 'STAT205')], [('',)], [('CS412', 'CS421', 'CS443', 'GER')], [('', 'CS444', 'FREE', 'FREE')], [('', '')]]