好的,我有两个列表,列表1和列表2.我想找到列表1和列表2中的所有项目,并从列表1中删除它们。我想到的第一种方式这是循环遍历列表1然后循环遍历列表2以查看它是否在列表2中,但是当放大时这看起来很慢且效率低。有没有更有效的方法呢?
此外,这些列表将按字母顺序排列(它们是字符串),如果这有用的话。
我正在使用python,但我也从一般的编程角度思考。
list1 = ['bar','foo','hello','hi']
list2 = ['alpha','bar','hello','xam']
list1将成为['foo','hi']
答案 0 :(得分:6)
在python中,你可能想要使用一个集合:
intersection = set(list1).intersection(list2)
这将返回set
,它会销毁订单(以及其他内容),但您可以随后使用该集合来过滤list1
:
list1 = [x for x in list1 if x not in intersection]
如果您真的想要使用该集合,则交集非常有用。正如评论中指出的那样,如果你根本不想要一套,那实际上并没有必要:
set2 = set(list2)
list1 = [x for x in list1 if x not in set2]
答案 1 :(得分:4)
使用set
来区分两者:
list1 = ['bar','foo','hello','hi']
list2 = ['alpha','bar','hello','xam']
set1 = set(list1)
set2 = set(list2)
set1 - set2
输出:
set(['hi', 'foo'])
如@chepner所述,使用set.difference,只需将第一个转换为集合
set1.difference(list2)
如果订单很重要,请将一个设为一套,然后将另一个与之比较:
set2 = set(list2)
[x for x in list1 if x not in set2]
输出:
['foo', 'hi']
答案 2 :(得分:1)
这是使用通用编程方法的解决方案,不使用集合,也没有特别优化。它依赖于两个被排序的列表。
list1 = ['a', 'b', 'd', 'f', 'k']
list2 = ['c', 'd', 'i']
result = []
i1 = 0
i2 = 0
while i1 < len(list1) and i2 < len(list2):
# invariants:
# list1[i1] not in list2[:i2], and
# result == (list1[:i1] with elements of list2[:i2] omitted)
#
if list1[i1] < list2[i2]:
# By assumption, list1[i1] not in list2[:i2],
# and because list2 is sorted, the true 'if' condition
# implies that list1[i1] isn't in list2[i2:] either;
# that is, it isn't in list2 at all.
result.append(list1[i1])
i1 += 1
elif list1[i1] > list2[i2]:
# can't decide membership of list1[i1] yet;
# advance to next element of list2 and loop again
i2 += 1
else:
# list1[i1] == list2[i2], so omit this element
i1 += 1
i2 += 1
# Add any remaining elements of list1 to tail of result
if i1 < len(list1):
result.extend(list1[i1:])
print(result)
结果:
['a', 'b', 'f', 'k']