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

2024-04-25 03:36:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在使用Python3进行一个项目,需要实现这样的代码,在这里我使用一个API来传递具有限制计数的项,并且需要找出已添加的最新项。你知道吗

我肯定有一种更像Python的方法,但我想不出任何方法。请让我知道,如果有类似的重复问题,因为我找不到一个。你知道吗

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

更新:

我在这些列表中有数千个条目,并且列表2中的大多数条目与列表1中的条目重复。我需要更有效的方法来处理这些差异。你知道吗


Tags: 项目方法代码api列表index条目items
3条回答

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

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])

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

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

类似地,您可以将每一个集合操作作为一个理解来编写,只需要一个小的持续减速,只留下主iterable,并且只将您正在in测试的集合转换为一个集合。你知道吗

通常,处理这些信息的方法是将较小的一个转换为一个集合,并将另一个作为列表保留。但是在你的情况下,你想保持两个中的一个的顺序。因此,将这个作为一个列表,并将另一个转换为一个集合:

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

这将解决您的问题:

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

相关问题 更多 >