# list_intersection.py
# MIT OCW 6.189 Homework 3
# Exercise 3.1 – Additional List Practice
# Mechanical MOOC
# Written for Python 3
# Glenn Richard
# July 15, 2013
def list_intersection(list_1, list_2):
# return intersection of list_1 and list_2
return [item for item in list_1 if item in list_2]
print("list_intersection")
print(list_intersection([1, 3, 5], [5, 3, 1]))
print(list_intersection([1, 3, 6, 9], [10, 14, 3, 72, 9]))
print(list_intersection([2, 4, 6], [1, 3, 5]))
# but a problem occurs when duplicates appear in a list ...
print(list_intersection([1, 1, 2, 3, 5, 8, 13], [1, 3, 5, 7, 9, 11, 13]))
print(list_intersection([1, 3, 5, 7, 9, 11, 13], [1, 1, 2, 3, 5, 8, 13]))
def list_intersection_unique(list_1, list_2):
# return intersection of list_1 and list_2 - essentially, set intersection
# so, each item that appears in both lists appears once in the returned new list
return list({item for item in list_1 if item in list_2})
print("list_intersection_unique")
print(list_intersection_unique([1, 1, 2, 3, 5, 8, 13], [1, 3, 5, 7, 9, 11, 13]))
def list_intersection_minimalist(list_1, list_2):
# return a new list in which
# each item appears the lesser of the number of times
# that it appears either list
new_list = []
for item in set(list_1):
new_list += [item] * min(list_1.count(item), list_2.count(item))
return new_list
print("list_intersection_minimalist")
print(list_intersection_minimalist([1, 1, 1, 2, 3, 4], [1, 2, 1, 3, 7]))
print(list_intersection_minimalist([1, 2, 1, 3, 7], [1, 1, 1, 2, 3, 4]))
IyBsaXN0X2ludGVyc2VjdGlvbi5weQojIE1JVCBPQ1cgNi4xODkgSG9tZXdvcmsgMwojIEV4ZXJjaXNlIDMuMSDigJMgQWRkaXRpb25hbCBMaXN0IFByYWN0aWNlCiMgTWVjaGFuaWNhbCBNT09DCiMgV3JpdHRlbiBmb3IgUHl0aG9uIDMKIyBHbGVubiBSaWNoYXJkCiMgSnVseSAxNSwgMjAxMwpkZWYgbGlzdF9pbnRlcnNlY3Rpb24obGlzdF8xLCBsaXN0XzIpOgogICAgIyByZXR1cm4gaW50ZXJzZWN0aW9uIG9mIGxpc3RfMSBhbmQgbGlzdF8yCiAgICByZXR1cm4gW2l0ZW0gZm9yIGl0ZW0gaW4gbGlzdF8xIGlmIGl0ZW0gaW4gbGlzdF8yXQoKcHJpbnQoImxpc3RfaW50ZXJzZWN0aW9uIikKcHJpbnQobGlzdF9pbnRlcnNlY3Rpb24oWzEsIDMsIDVdLCBbNSwgMywgMV0pKQpwcmludChsaXN0X2ludGVyc2VjdGlvbihbMSwgMywgNiwgOV0sIFsxMCwgMTQsIDMsIDcyLCA5XSkpCnByaW50KGxpc3RfaW50ZXJzZWN0aW9uKFsyLCA0LCA2XSwgWzEsIDMsIDVdKSkKIyBidXQgYSBwcm9ibGVtIG9jY3VycyB3aGVuIGR1cGxpY2F0ZXMgYXBwZWFyIGluIGEgbGlzdCAuLi4KcHJpbnQobGlzdF9pbnRlcnNlY3Rpb24oWzEsIDEsIDIsIDMsIDUsIDgsIDEzXSwgWzEsIDMsIDUsIDcsIDksIDExLCAxM10pKQpwcmludChsaXN0X2ludGVyc2VjdGlvbihbMSwgMywgNSwgNywgOSwgMTEsIDEzXSwgWzEsIDEsIDIsIDMsIDUsIDgsIDEzXSkpCgpkZWYgbGlzdF9pbnRlcnNlY3Rpb25fdW5pcXVlKGxpc3RfMSwgbGlzdF8yKToKICAgICMgcmV0dXJuIGludGVyc2VjdGlvbiBvZiBsaXN0XzEgYW5kIGxpc3RfMiAtIGVzc2VudGlhbGx5LCBzZXQgaW50ZXJzZWN0aW9uCiAgICAjIHNvLCBlYWNoIGl0ZW0gdGhhdCBhcHBlYXJzIGluIGJvdGggbGlzdHMgYXBwZWFycyBvbmNlIGluIHRoZSByZXR1cm5lZCBuZXcgbGlzdAogICAgcmV0dXJuIGxpc3Qoe2l0ZW0gZm9yIGl0ZW0gaW4gbGlzdF8xIGlmIGl0ZW0gaW4gbGlzdF8yfSkKcHJpbnQoImxpc3RfaW50ZXJzZWN0aW9uX3VuaXF1ZSIpCnByaW50KGxpc3RfaW50ZXJzZWN0aW9uX3VuaXF1ZShbMSwgMSwgMiwgMywgNSwgOCwgMTNdLCBbMSwgMywgNSwgNywgOSwgMTEsIDEzXSkpCgoKZGVmIGxpc3RfaW50ZXJzZWN0aW9uX21pbmltYWxpc3QobGlzdF8xLCBsaXN0XzIpOgogICAgIyByZXR1cm4gYSBuZXcgbGlzdCBpbiB3aGljaAogICAgIyBlYWNoIGl0ZW0gYXBwZWFycyB0aGUgbGVzc2VyIG9mIHRoZSBudW1iZXIgb2YgdGltZXMKICAgICMgdGhhdCBpdCBhcHBlYXJzIGVpdGhlciBsaXN0CiAgICBuZXdfbGlzdCA9IFtdCiAgICBmb3IgaXRlbSBpbiBzZXQobGlzdF8xKToKICAgICAgICBuZXdfbGlzdCArPSBbaXRlbV0gKiBtaW4obGlzdF8xLmNvdW50KGl0ZW0pLCBsaXN0XzIuY291bnQoaXRlbSkpCiAgICByZXR1cm4gbmV3X2xpc3QKcHJpbnQoImxpc3RfaW50ZXJzZWN0aW9uX21pbmltYWxpc3QiKQpwcmludChsaXN0X2ludGVyc2VjdGlvbl9taW5pbWFsaXN0KFsxLCAxLCAxLCAyLCAzLCA0XSwgWzEsIDIsIDEsIDMsIDddKSkKcHJpbnQobGlzdF9pbnRlcnNlY3Rpb25fbWluaW1hbGlzdChbMSwgMiwgMSwgMywgN10sIFsxLCAxLCAxLCAyLCAzLCA0XSkpCg==