If your lists can't contain duplicates and you don't care about the order then you should be using sets instead of lists (by the way, they are called lists, not arrays). Then what you want is both fast and trivial to implement:
>>> set1 = set(["abc", "def", "ghi", "jkl"])
>>> set2 = set(["abc", "ghi", "456", "789"])
>>> set2 - set1
set(['456', '789'])
If list2 can contain duplicates or the order matters then you can still make list1 a set to speed up the lookups:
>>> list1 = ["abc", "def", "ghi", "jkl"]
>>> list2 = ["abc", "ghi", "456", "789"]
>>> set1 = set(list1)
>>> [a for a in list2 if a not in set1]
['456', '789']
Note that this requires that the items are hashable but runs in close to O(n) time.
If the items are not hashable but they are orderable then you could sort list1 and use a binary search to find items in it. This gives O(n log(n)) time.
If your items are neither hashable not orderable then you will need to resort to the slow O(n*n) simple linear search for each element.