Reputation: 728
I have a list which has these elements(list consists str(elements)):
['-0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15']
and I want to process it to have an output like this
['-0', '1#', '15#']
If the element is -x i want to leave it there so I take the last 2 elements and if the gap is 1 then remove the element before the last element. Here is the code:
for k in range(len(l1)):
if "-" in (l1[-k] or l1[-k-1]):
print("debuggggg")
pass
elif(int(l1[-k]) - int(l1[-k-1])== 1 and int(l1[-k]) - int(l1[-k-2])== 2) :
a= l1[-2]
print(a)
l1.remove(a)
#print("debug 2")
elif(int(l1[-k]) - int(l1[-k-1])== 1):
a= l1[-2]
l1.remove(a)
l1[-2] = l1[-2] +"#"
l1[-1] = l1[-1] +"#"
print("3")
#elif(type(l1[-2]) is str):
#pass
Problem is here :
debuggggg
14
13
12
11
10
9
8
The last 2 elements do not include char "-" but it seems that they do. Furthermore after the 8 loop script crashes:
elif(int(l1[-k]) - int(l1[-k-1])== 1 and int(l1[-k]) - int(l1[-k-2])== 2) :
IndexError: list index out of range
but it is not out the range of the list. What is the problem?
Upvotes: 1
Views: 147
Reputation: 4521
Your second question
but it is not out the range of the list. What is the problem?
It is just out of range error.
l1[-len(l1)-1]
raises this error. You are doing this in your code.
for k in range(len(l1)):
...
elif(int(l1[-k]) - int(l1[-k-1])== 1 and int(l1[-k]) - int(l1[-k-2])== 2) :#<--here(l1[-k-2])
Upvotes: 3
Reputation: 134
yes It is IndexError: list index out of range. Because you are trying to access l1[-10] at line 5, which does not exist in l1 after 8 iterations.
See the following debug info:
>>> l1 = ['-0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15']
>>> for k in range(len(l1)):
... if "-" in (l1[-k] or l1[-k-1]):
... print("debuggggg")
... pass
... elif(int(l1[-k]) - int(l1[-k-1])== 1 and int(l1[-k]) - int(l1[-k-2])== 2) :
... a= l1[-2]
... print(a)
... l1.remove(a)
... print l1
... #print("debug 2")
... elif(int(l1[-k]) - int(l1[-k-1])== 1):
... a= l1[-2]
... l1.remove(a)
... l1[-2] = l1[-2] +"#"
... l1[-1] = l1[-1] +"#"
... print("3")
... #elif(type(l1[-2]) is str):
... #pass
...
debuggggg
14
['-0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '15']
13
['-0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '15']
12
['-0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '15']
11
['-0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '15']
10
['-0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '15']
9
['-0', '1', '2', '3', '4', '5', '6', '7', '8', '15']
8
['-0', '1', '2', '3', '4', '5', '6', '7', '15']
Traceback (most recent call last):
File "<stdin>", line 5, in <module>
IndexError: list index out of range
I have just printed list l1. After 8 iterations,int(l1[-k-2] is not accessible. This is the reason why u are getting Index error
Upvotes: 3
Reputation: 620
You should rather have a source list that you iterate over and a results list that you insert elements into.
source_list = ['-1', '1', '2', '3']
results_list = []
for item in source_list:
# Do some tests, and put items into the results list if you want them.
# I think this is what you want, although I couldn't understand from your question.
if '-' in item:
results_list.append(item)
else:
results_list.append(item + '#')
If there is some other requirement then let me know, and I will try to adapt my example.
Upvotes: 3
Reputation: 6284
You're removing items from the list. If you start with l1
containing ten items then k is going to go from 0 to 9, but if you remove an item from l1
then l1[9]
no longer exists.
Also I think if "-" in (l1[-k] or l1[-k-1]):
is testing whether "-"
is in the logical OR of l1[-k]
and l1[-k-1]
, which I don't think is what you intended?
Upvotes: 3