我目前正在使用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中的项目重复。我需要一些更有效的方法来处理这些差异。
答案 0 :(得分:4)
您可以使用list2.index()
查找list1
中list2
第一项的索引:
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))