'Find matching values in a list of lists
I'm trying to iterate over a list of lists in python 2.7.5 and return those where the first value is found in a second list, something like this:
#python 2.7.5
list1 = ['aa', 'ab', 'bb', 'bc', 'cc']
list2 = [['aa', 1, 3, 7],['de', 2, 2, 1],['bc', 3, 4, 4]]
list3 = []
for x in list1:
for y in list2:
if x == y:
list3.append(y)
So I would want list3 to contain [['aa',1,3,7],['bc', 3, 4, 4]]
but instead I just get the whole of list2.
Solution 1:[1]
Try a more simple approach that is closer to what you want:
for e in list2:
if e[0] in list1:
list3.append(e)
You need e[0]
since list2
is a list of lists. You can also write this in a single line using the filter() function:
list3 = filter(lambda e: e[0] in list1, list2)
or using list comprehension:
list3 = [e for e in list2 if e[0] in list1]
Solution 2:[2]
There's just a bug in your code. You need x == y[0] instead of x == y. The latter is comparing a string to a list.
You can also use list comprehensions
>>> [x for x in list2 if x[0] in list1]
[['aa', 1, 3, 7],['bc', 3, 4, 4]]
Solution 3:[3]
It looks like your issue is because you are attempting to compare a list of elements against a list of a list of elements.
If you step through the for
loop, you'll see that on your first iteration you are comparing
'aa'
against ['aa', 1, 3, 7]
, which is probably not what you would like to do.
If you're just comparing the first element, you will need to change your for
loop to:
for x in list1:
for y in list2:
if x == y[0]:
list3.append(y)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Aaron Digulla |
Solution 2 | |
Solution 3 |