If I change new_lst.append() to append l instead of lst[l], it gives me a value of 3, the index

Actually it is giving you the value of 3, stored at index 1. I would advice you to try this with some different (higher) numbers so you can see what is happening without the confusion that it might be an index.

```
value_at_index_i = list[i]
```

The above code returns the value stored at the given index (i) which is illustrated by its output:

```
for i in range(len(lst)):
print(i, lst[I])
(index, value)
(0, 4)
(1, 3)
(2, 7)
(3, 10)
(4, 11)
(5, -2)
```

Now that we know that lst[I] gives the value stored at the given index, we need to have a good look at the following code:

```
if l < len(lst) and l % 2 == 1:
new_lst.append(lst[l])
```

As mentioned lst[i] returns the value stored at given index *i* so:

```
lst = [4, 11, 75, 13, 144, 6]
for l in lst:
# l= 4
if l < len(lst):
new_lst.append(lst[4]) #Here we are adding the value of 144 because that is stored at index 4
```

I hope I have been able to put my thoughts on paper in a semi-understandable way

For the example range():

The range() function (simply said) returns a sequence of numbers starting at 0 to x-1.

```
for value in range(4):
print(value)
0
1
2
3
```

In most cases this coincides with the indexes of a list so this would lead to:

```
for value in range(4):
print(f"lst[{value}]")
lst[0]
lst[1]
lst[2]
lst[3]
```

As you mentioned that snippet of code works as it should, and with the explanations above you should now be able to figure out why it indeed works. And no worries… before you know it you can solve this entire assignment in a single line of code