【问题标题】:How to compare two lists and copy the differences into a third (python)?如何比较两个列表并将差异复制到第三个(python)?
【发布时间】:2022-01-14 02:35:26
【问题描述】:

我是编程初学者。 我正在尝试比较两个列表并将差异保存在第三个列表中。

如何将不正确的值复制到第三个列表中?

我确信有更有效的编码方式,但我需要使用我在这里拥有的东西(除非它无法修复)。

mc_answers 是 [A, C, A, A, D] 我试图将它与用户输入的任何内容进行比较,所以如果 input_list 是 [A, A, A, A, A,],w_answers 将是 [C, D](函数 user_input 被分配给 input_list 以使其更容易合作)。

        def wrong_input(input_list, mc_answers):

        print()
        wrong_answers=[]

        for i in range (5):
            while input_list[i]!=mc_answers[i]:
                wrong_answers.append(input_list[i])
               
  

       return wrong_answers

还有:

    def main():

        mc_answers=['A', 'C', 'A', 'A', 'D']
    
        display_test()


        input_list=user_input()
        print(wrong_input(input_list, mc_answers))


    def user_input():
        user_answers=[]
        print()
        for i in range (5):
            user_answers.append(input('\nAnswer'+str(i+1)+ ': '))
        
        return user_answers

    def wrong_input(input_list, mc_answers):

        print()
        w_answers=[]

        for i in range (5):
            while input_list[i]!=mc_answers[i]:
                w_answers.append(input_list[i])
                
  

       return w_answers

    main()

【问题讨论】:

    标签: python list function


    【解决方案1】:

    不要试图提出自己的算法来确定两个列表之间的差异。您可以使用set 确定两个列表之间的差异。集合是 Python 中的一种内置数据类型,可使用 set() 函数(类似于 list() 函数)或 {} 调用。

    您可以使用symmetric_difference 方法来确定两个列表之间的差异,或者您可以使用difference 方法来确定一个列表中不存在于另一个列表中的差异。考虑一下,

    list1 = [3, 12, 7, 8]
    list2 = [1, 5, 12, 3]
    list3 = set(list1).symmetric_difference(list2)
    print(list(list3))
    

    这个输出:

    [1, 5, 7, 8]
    

    这意味着数字 1、5、7 和 8 在 list1list2 之间并不通用。根据您的需要,您可以使用difference 方法:

    list1 = [3, 12, 7, 8]
    list2 = [1, 5, 12, 3]
    list3 = set(list1).difference(list2)
    print(list(list3))
    

    这个输出:

    [7, 8]
    

    这意味着 7 和 8 在 list1 中,但不在 list2 中。但是,您需要记住集合的一些后果。例如,如果您将列表转换为集合,它将删除重复项。看到这个:

    list1 = [1, 1, 2, 3]
    print(set(list1))
    

    哪些输出:

    {1, 2, 3}
    

    有关集合的更好解释,请参阅this

    编辑

    如果您只想要一个完成您给我们的示例的函数,那么集合可能不是可行的方法,因为您正在处理具有重复项的列表。您可以使用 len 函数找出 range 函数中的内容。

    def wrong_input(input_list, correct_answers):
        wrong_answers = []
    
        for i in range(len(correct_answers)):
            for j in range(len(input_list)):
                # Move to the next item in correct_answers if this is true:
                if input_list[j] == correct_answers[i]:
                    break
    
                # If we hit this condition, then that means that we looped through all of input_list and there were no
                # items that were the equal an individual item in correct_answers
                if j == len(input_list) - 1:
                    wrong_answers.append(correct_answers[i])
    
        return wrong_answers
    
    
    mc_answers = ['A', 'C', 'A', 'A', 'D']
    user_answers = ['A', 'A', 'A', 'A', 'A']
    
    print(wrong_input(user_answers, mc_answers))
    

    这个输出:

    ['C', 'D']
    

    【讨论】:

    • 听起来不错,但我需要一些简单的东西。就像我说的,我才刚刚开始,有些话题我还没有学过。还有其他方法吗?
    • 如果您想获得有关代码的更多反馈,您应该在wrong_input 函数中包含一个示例输入以及该函数的正确输出。您可以编辑您的帖子以包含此内容。 @BNS
    • 我对我的帖子进行了编辑。这只是实现目标的一种简单方法,但还有更好的方法可供考虑。
    【解决方案2】:

    首先,感谢所有帮助过的人。 对于任何试图找到一种更简单(尽管效率不高)的方法的人:

    def wrong_input(input_list, mc_answers): # The two parameters are lists from main() and user_input()
    
        wrong_answers=[]
        for i in range(5):
            if input_list[i]!=mc_answers[i]:
                wrong_answers.append(input_list[i])
    
        return wrong_answers
    

    在@Barmar 指出while 循环在这种情况下永远不会结束后,我将while 更改为if 语句。

    要记住的无关点(以防有人遇到它们,就像我一样):

    • 比您要比较的列表更大的范围(即此代码中的 range(6) 而不是 range(5)。)将导致错误 list index out of range(此代码中的两个列表的长度均为 5。)
    • 我的代码的第一个版本导致错误function 'object' not subscriptable。 @Barmar 指出我在引用函数 user_input input_list=user_input 而不是 input_list=user_input() 时省略了括号,导致了这个错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 2018-11-08
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      相关资源
      最近更新 更多