Logan Yang - 1 year ago 53

Python Question

I have a long list of float numbers ranging from 1 to 5, called "average", and I want to return the list of indices for elements that are smaller than a or larger than b

`def find(lst,a,b):`

result = []

for x in lst:

if x<a or x>b:

i = lst.index(x)

result.append(i)

return result

matches = find(average,2,4)

But surprisingly, the output for "matches" has a lot of repetitions in it, e.g.

`[2, 2, 10, 2, 2, 2, 19, 2, 10, 2, 2, 42, 2, 2, 10, 2, 2, 2, 10, 2, 2, ...]`

Why is this happening?

Answer

You are using `.index()`

which will only find the **first** occurrence of your value in the list. So if you have a value 1.0 at index 2, and at index 9, then `.index(1.0)`

will *always* return `2`

, no matter how many times `1.0`

occurs in the list.

Use `enumerate()`

to add indices to your loop instead:

```
def find(lst, a, b):
result = []
for i, x in enumerate(lst):
if x<a or x>b:
result.append(i)
return result
```

You can collapse this into a list comprehension:

```
def find(lst, a, b):
return [i for i, x in enumerate(lst) if x<a or x>b]
```

Source (Stackoverflow)