To write a for loop on one line in Python, known more commonly as the list comprehension, wrap the for loop in a list like so: [elem for elem in my_loop] . As you can see from the above example the output is exactly the same as the input but demonstrates the point that the inline for loop as detailed works.
Summary: To write a nested for loop in a single line of Python code, use the one-liner code [print(x, y) for x in iter1 for y in iter2] that iterates over all values x in the first iterable and all values y in the second iterable.
Because of differences in how Python implements for loops and list comprehension, list comprehensions are almost always faster than for loops when performing operations.
What you are using is called a list comprehension in Python, not an inline for-loop (even though it is similar to one). You would write your loop as a list comprehension like so:
p = [q.index(v) if v in q else 99999 for v in vm]
When using a list comprehension, you do not call list.append
because the list is being constructed from the comprehension itself. Each item in the list will be what is returned by the expression on the left of the for
keyword, which in this case is q.index(v) if v in q else 99999
. Incidentially, if you do use list.append
inside a comprehension, then you will get a list of None
values because that is what the append
method always returns.
your list comphresnion will, work but will return list of None because append return None:
demo:
>>> a=[]
>>> [ a.append(x) for x in range(10) ]
[None, None, None, None, None, None, None, None, None, None]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
better way to use it like this:
>>> a= [ x for x in range(10) ]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
you can use enumerate keeping the ind/index of the elements is in vm, if you make vm
a set you will also have 0(1)
lookups:
vm = {-1, -1, -1, -1}
print([ind if q in vm else 9999 for ind,ele in enumerate(vm) ])
q = [1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5]
vm = [-1, -1, -1, -1,1,2,3,1]
p = []
for v in vm:
if v in q:
p.append(q.index(v))
else:
p.append(99999)
print p
p = [q.index(v) if v in q else 99999 for v in vm]
print p
Output:
[99999, 99999, 99999, 99999, 0, 1, 2, 0]
[99999, 99999, 99999, 99999, 0, 1, 2, 0]
Instead of using append()
in the list comprehension you can reference the p as direct output, and use q.index(v)
and 99999
in the LC.
Not sure if this is intentional but note that q.index(v)
will find just the first occurrence of v
, even tho you have several in q
. If you want to get the index of all v
in q
, consider using a enumerator
and a list of already visited indexes
Something in those lines(pseudo-code):
visited = []
for i, v in enumerator(vm):
if i not in visited:
p.append(q.index(v))
else:
p.append(q.index(v,max(visited))) # this line should only check for v in q after the index of max(visited)
visited.append(i)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With