【问题标题】:Python - Compare two lists in a comprehensionPython - 在理解中比较两个列表
【发布时间】:2011-08-05 09:19:22
【问题描述】:

我试图理解理解是如何工作的。

我想遍历两个列表,然后比较每个列表以找出差异。 如果一个/或多个单词不同,我想打印这个单词。

我希望这一切都在一行漂亮的代码中,这就是我对推导感兴趣的原因。

【问题讨论】:

    标签: list python-3.x list-comprehension


    【解决方案1】:

    在“一行漂亮的代码”中执行此操作是代码高尔夫,并且被误导了。改为可读。

    for a, b in zip(list1, list2):
        if a != b:
           print(a, "is different from", b) 
    

    这与此没有任何显着差异:

    [print(a, "is different from", b) for a, b in zip(list1, list2) if a!=b]
    

    除了扩展版本比理解更容易阅读和理解。

    【讨论】:

    • 我同意,它更容易阅读,但我已经这样做了一段时间了,我已经厌倦了它.. 不是 zip 方法,谢谢你给我看。如果这些方法更短......我可能会学习它......可能会派上用场
    • 不,没有更短的方法来进行这种比较。其他解决方案对什么是“差异”有不同的看法。哪个是正确的取决于你。厌倦编写好的代码可能不是一个好的理由。 ;)
    • 作为本周学习 Python 的人,我感谢您的回答和代码的清晰性。好东西!
    • 如果两个列表的大小相同,这将很有效。如果列表 a 比列表 b 大怎么办?
    • 第二个代码 sn-p 的显着不同在于它构建了一个由 print 调用返回的 None 值的毫无意义的列表 - 这是不符合 Python 标准的,列表 Comphrensions 用于构建列表而不是过程调用
    【解决方案2】:

    就像 kriegar 建议的那样,使用集合可能是最简单的解决方案。如果你绝对需要使用列表理解,我会使用这样的东西:

    list_1 = [1, 2, 3, 4, 5, 6]
    list_2 = [1, 2, 3, 0, 5, 6]
    
    # Print all items from list_1 that are not in list_2 ()
    print(*[item for item in list_1 if item not in list_2], sep='\n')
    
    # Print all items from list_1 that differ from the item at the same index in list_2
    print(*[x for x, y in zip(list_1, list_2) if x != y], sep='\n')
    
    # Print all items from list_2 that differ from the item at the same index in list_1
    print(*[y for x, y in zip(list_1, list_2) if x != y], sep='\n')
    

    【讨论】:

      【解决方案3】:

      如果你想比较两个列表的差异,我想你想使用set

      s.symmetric_difference(t)   s ^ t   new set with elements in either s or t but not both
      

      示例:

      >>> L1 = ['a', 'b', 'c', 'd']
      >>> L2 = ['b', 'c', 'd', 'e'] 
      >>> S1 = set(L1)
      >>> S2 = set(L2)
      >>> difference = list(S1.symmetric_difference(S2))
      >>> print difference
      ['a', 'e']
      >>> 
      

      单行表格?

      >>> print list(set(L1).symmetric_difference(set(L2)))
      ['a', 'e']
      >>> 
      

      如果你真的想使用列表推导:

      >>> [word for word in L1 if word not in L2] + [word for word in L2 if word not in L1]
      ['a', 'e']
      

      随着列表大小的增加,效率会大大降低。

      【讨论】:

      • 这是一个很好的建议,我会毫不犹豫地使用它。但是在我寻求了解更多关于理解的过程中,我必须给 überjesus 打勾……除非我能给出多个,否则我没有尝试过
      • 我的理解是元素可以重复,顺序很重要。这样set 的使用不会产生正确的结果。
      猜你喜欢
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      相关资源
      最近更新 更多