Finding a needle in a haystack *TypeError: list indices must be integers or slices, not str*
Question:
i tried changing from a list to a dictionary but it did not work.
I reduced the problem to finding a array of strings(needle
) in another array of strings(hay
). The rest i can do on my own
needle = []
for x in range(2015,2017):
needle.append(str(x))
hay = []
for x in range(2015,2090):
hay.append(str(x))
print(needle)
print(hay)
for a in needle:
for b in hay:
if needle[b] in hay[a]:
print("Found!")
else:
print("Not found!")
Answers:
There are different numbers involved here – you have the value/element (i.e. the thing you’re adding to the array) and the index; the element’s position within that array. When comparing your needle value with your haystack value you want to compare the values (which you’re doing); but to get those values you want to look in the array in the relevant position (which you’re not).
Instead, try something like this:
needle = []
for x in range(2015,2017):
needle.append(str(x))
hay = []
for x in range(2015,2022):
hay.append(str(x))
print(needle)
print(hay)
for needleIndex in range(len(needle)):
for hayIndex in range(len(hay)):
if needle[needleIndex] == hay[hayIndex]:
print("Found!")
else:
print("Not found!")
This change means that instead of a
being '2015'
, '2016'
, '2017'
instead needleIndex
is 0
,1
,2
and needle[needleIndex]
is '2015'
, '2016'
, '2017'
.
Hope that helps to clarify what’s going on.
ps. For this example you don’t need the indexes; you could just have
for a in needle:
for b in hay:
if b == a:
print("Found!")
else:
print("Not found!")
Simpler still; you’ve shown that you’re aware of the in
operator; though you’ve been comparing individual values from the 2 arrays (hence I changed it to ==
above)… You can use your in
operator like this:
for a in needle:
if a in hay:
print("Found!")
else:
print("Not found!")
You can also use the array_intersect
function to check for all elements which exist in both arrays… More on that here: https://stackoverflow.com/a/8679430/361842
i tried changing from a list to a dictionary but it did not work.
I reduced the problem to finding a array of strings(needle
) in another array of strings(hay
). The rest i can do on my own
needle = []
for x in range(2015,2017):
needle.append(str(x))
hay = []
for x in range(2015,2090):
hay.append(str(x))
print(needle)
print(hay)
for a in needle:
for b in hay:
if needle[b] in hay[a]:
print("Found!")
else:
print("Not found!")
There are different numbers involved here – you have the value/element (i.e. the thing you’re adding to the array) and the index; the element’s position within that array. When comparing your needle value with your haystack value you want to compare the values (which you’re doing); but to get those values you want to look in the array in the relevant position (which you’re not).
Instead, try something like this:
needle = []
for x in range(2015,2017):
needle.append(str(x))
hay = []
for x in range(2015,2022):
hay.append(str(x))
print(needle)
print(hay)
for needleIndex in range(len(needle)):
for hayIndex in range(len(hay)):
if needle[needleIndex] == hay[hayIndex]:
print("Found!")
else:
print("Not found!")
This change means that instead of a
being '2015'
, '2016'
, '2017'
instead needleIndex
is 0
,1
,2
and needle[needleIndex]
is '2015'
, '2016'
, '2017'
.
Hope that helps to clarify what’s going on.
ps. For this example you don’t need the indexes; you could just have
for a in needle:
for b in hay:
if b == a:
print("Found!")
else:
print("Not found!")
Simpler still; you’ve shown that you’re aware of the in
operator; though you’ve been comparing individual values from the 2 arrays (hence I changed it to ==
above)… You can use your in
operator like this:
for a in needle:
if a in hay:
print("Found!")
else:
print("Not found!")
You can also use the array_intersect
function to check for all elements which exist in both arrays… More on that here: https://stackoverflow.com/a/8679430/361842