python - 在python中每次只比较多个列表一次

标签 python list loops

我在处理一些代码时遇到了问题。我希望我的代码比较多个列表的列表中包含的 2 个列表,但每次只比较一次。

resultList = [
    ['Student1', ['Sport', 'History']],
    ['Student2', ['Math', 'Spanish']],
    ['Student3', ['French', 'History']],
    ['Student4', ['English', 'Sport']],
]

for list1 in resultList:
    for list2 in resultList:
        i = 0
        for subject in list1[1]:
            if subject in list2[1]:
                if list2[1].index(subject) >= list1[1].index(subject):
                    i+=1
                else:
                    i+=2
        print(list1[0] + ' - ' + list2[0] + ' : ' + str(i))

这会打印:

Student1 - Student1 : 2
Student1 - Student2 : 0
Student1 - Student3 : 1
Student1 - Student4 : 1
Student2 - Student1 : 0
Student2 - Student2 : 2
Student2 - Student3 : 0
Student2 - Student4 : 0
Student3 - Student1 : 1
Student3 - Student2 : 0
Student3 - Student3 : 2
Student3 - Student4 : 0
Student4 - Student1 : 2
Student4 - Student2 : 0
Student4 - Student3 : 0
Student4 - Student4 : 2

我想要这样的结果:

Student1 - Student1 : 2
Student1 - Student2 : 0
Student1 - Student3 : 1
Student1 - Student4 : 1
Student2 - Student2 : 2
Student2 - Student3 : 0
Student2 - Student4 : 0
Student3 - Student3 : 2
Student3 - Student4 : 0
Student4 - Student4 : 2

感谢您的帮助!

最佳答案

我要么使用 itertools.combinations_with_replacementitertools.combinations为此:

In [1]: resultList = [
   ...:     ['Student1', ['Sport', 'History']],
   ...:     ['Student2', ['Math', 'Spanish']],
   ...:     ['Student3', ['French', 'History']],
   ...:     ['Student4', ['English', 'Sport']],
   ...: ]
   ...:

In [2]: import itertools
In [3]: new_result = itertools.combinations_with_replacement(resultList, 2)
In [4]: for lists_tuple in new_result:
    ...:     list1, list2 = lists_tuple
    ...:     i = 0
    ...:     for subject in list1[1]:
    ...:         if subject in list2[1]:
    ...:             if list2[1].index(subject) >= list1[1].index(subject):
    ...:                 i+=1
    ...:             else:
    ...:                 i+=2
    ...:     print(list1[0] + ' - ' + list2[0] + ' : ' + str(i))
    ...:
    ...:
Student1 - Student1 : 2
Student1 - Student2 : 0
Student1 - Student3 : 1
Student1 - Student4 : 1
Student2 - Student2 : 2
Student2 - Student3 : 0
Student2 - Student4 : 0
Student3 - Student3 : 2
Student3 - Student4 : 0
Student4 - Student4 : 2

组合

如果您决定不想将每个列表与其自身进行比较(Student1 - Student1),请将 combinations_with_replacement 更改为 combinations 并且您将获得列表中不同元素之间的比较:

Student1 - Student2 : 0
Student1 - Student3 : 1
Student1 - Student4 : 1
Student2 - Student3 : 0
Student2 - Student4 : 0
Student3 - Student4 : 0

关于python - 在python中每次只比较多个列表一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56356237/

相关文章:

Python:字符串连接对象的多个属性

Java - 循环访问类的实例,而不是为每个单独的实例调用方法

python - 为什么在 Python 的 TRY block 中不可能有 IF 语句,如果可能的话,这是好的做法吗?

python - 在键/值对列表中查找值

java - 在 Java 中对双链表进行排序

将元素添加到 c 中列表开头的代码 - 错误是什么?

java - 我怎样才能让这个程序在线性时间内运行?

javascript - jquery递归函数中奇怪的无限循环错误

python - 我的完美数代码

python - Sympy - 访问solve()解决方案的单个部分