Pythonic方法获得两个列表之间的初始差异

时间:2018-03-20 17:47:15

标签: python

我目前正在使用Python3开发一个项目,并且需要实现这样的代码,我使用的API传递带有限制计数的项目,并且需要找出已添加的最新项目。

我确定必须有更多的pythonic方式,但无法想到任何方式。请告诉我,如果有类似的重复问题,我找不到。

list1 = ["d", "e", "f", "g", "h", "i", "j"] # items requested before
list2 = ["a", "b", "c", "d", "e", "f", "g"] # items requested now

for index, item in enumerate(list2):
    if item is list1[0]:
        print(list2[:index])
        break

更新:

我在这些列表中有数千个项目,并且大多数list2与list1中的项目重复。我需要一些更有效的方法来处理这些差异。

3 个答案:

答案 0 :(得分:4)

您可以使用list2.index()查找list1list2第一项的索引:

list1 = ["d", "e", "f", "g", "h", "i", "j"] # items requested before
list2 = ["a", "b", "c", "d", "e", "f", "g"] # items requested now

print(list2[:list2.index(list1[0])])

代码的以下部分

list2.index(list1[0])

将有效地找到list2中第一个元素的list1中的第一个索引。从算法的角度来看,这与手动实现的python循环一样有效,但在实践中效率更高,因为循环是在本地而不是在python中实现的。然后,您可以使用它从list2中取出切片,就像您在自己的解决方案中所做的一样。

答案 1 :(得分:3)

要进行设置差异(或交集,或任何其他设置操作),您不需要将两个列表转换为集合,只需将其中一个转换为集合。 set操作实际上是通过迭代第二个参数并对self参数执行set操作来实现的。 (这仅适用于指定的方法,而不适用于运算符。)

类似地,您可以将每个集合操作编写为只有一个小的常量减速的理解,只留下主可迭代,并且仅将您的in - 测试变为一组。

通常,您对此信息的处理方法是将较小的一个转换为一个集合,并将另一个作为列表。但在您的情况下,您希望保留两者之一的顺序。因此,将 一个作为列表,并将另一个转换为集合:

set1 = set(list1)
newlist = [elem for elem in list2 if elem not in set1]

答案 2 :(得分:1)

这将解决您的问题:

list(set(list2) - set(list1))