List value swapping: What's the correct order and why?
For a list of integers, such as A = [2, 10, -5]
, I get the error
Traceback (most recent call last):
File "so.py", line 6, in <module>
v, A[v-1] = A[v-1], v
IndexError: list assignment index out of range
Code:
for i, v in enumerate(A):
while 1<=v<=len(A) and v != A[v-1]:
v, A[v-1] = A[v-1], v
but this works:
for i, v in enumerate(A):
while 1<=v<=len(A) and v != A[v-1]:
A[v-1], v = v, A[v-1]
Why the order of the swapping elements matters here? v
is always being checked to be in bound.
Weirdly enough cannot reproduce a smaller example. But,
A = [6, 5, 4, 3, 2]
becomes an infinite loop.
python
|
show 3 more comments
For a list of integers, such as A = [2, 10, -5]
, I get the error
Traceback (most recent call last):
File "so.py", line 6, in <module>
v, A[v-1] = A[v-1], v
IndexError: list assignment index out of range
Code:
for i, v in enumerate(A):
while 1<=v<=len(A) and v != A[v-1]:
v, A[v-1] = A[v-1], v
but this works:
for i, v in enumerate(A):
while 1<=v<=len(A) and v != A[v-1]:
A[v-1], v = v, A[v-1]
Why the order of the swapping elements matters here? v
is always being checked to be in bound.
Weirdly enough cannot reproduce a smaller example. But,
A = [6, 5, 4, 3, 2]
becomes an infinite loop.
python
4
Can you provide A and n?
– Ssein
Nov 15 '18 at 17:29
1
You should refer to this post.
– Dimeji Mudele
Nov 15 '18 at 17:41
Don't reassign the iteration variable,v
.
– hpaulj
Nov 15 '18 at 17:55
1
i
is the index.v
the value.A[i]
makes sense.A[v]
does not.
– hpaulj
Nov 15 '18 at 17:58
Note that your inner loop is awhile
, not anif
. Your list [6, 5, 4, 3, 2] gets stuck in thewhile
.
– Prune
Nov 15 '18 at 18:10
|
show 3 more comments
For a list of integers, such as A = [2, 10, -5]
, I get the error
Traceback (most recent call last):
File "so.py", line 6, in <module>
v, A[v-1] = A[v-1], v
IndexError: list assignment index out of range
Code:
for i, v in enumerate(A):
while 1<=v<=len(A) and v != A[v-1]:
v, A[v-1] = A[v-1], v
but this works:
for i, v in enumerate(A):
while 1<=v<=len(A) and v != A[v-1]:
A[v-1], v = v, A[v-1]
Why the order of the swapping elements matters here? v
is always being checked to be in bound.
Weirdly enough cannot reproduce a smaller example. But,
A = [6, 5, 4, 3, 2]
becomes an infinite loop.
python
For a list of integers, such as A = [2, 10, -5]
, I get the error
Traceback (most recent call last):
File "so.py", line 6, in <module>
v, A[v-1] = A[v-1], v
IndexError: list assignment index out of range
Code:
for i, v in enumerate(A):
while 1<=v<=len(A) and v != A[v-1]:
v, A[v-1] = A[v-1], v
but this works:
for i, v in enumerate(A):
while 1<=v<=len(A) and v != A[v-1]:
A[v-1], v = v, A[v-1]
Why the order of the swapping elements matters here? v
is always being checked to be in bound.
Weirdly enough cannot reproduce a smaller example. But,
A = [6, 5, 4, 3, 2]
becomes an infinite loop.
python
python
edited Nov 15 '18 at 18:19
martineau
69.1k1092186
69.1k1092186
asked Nov 15 '18 at 17:22
kaiserasifkaiserasif
588
588
4
Can you provide A and n?
– Ssein
Nov 15 '18 at 17:29
1
You should refer to this post.
– Dimeji Mudele
Nov 15 '18 at 17:41
Don't reassign the iteration variable,v
.
– hpaulj
Nov 15 '18 at 17:55
1
i
is the index.v
the value.A[i]
makes sense.A[v]
does not.
– hpaulj
Nov 15 '18 at 17:58
Note that your inner loop is awhile
, not anif
. Your list [6, 5, 4, 3, 2] gets stuck in thewhile
.
– Prune
Nov 15 '18 at 18:10
|
show 3 more comments
4
Can you provide A and n?
– Ssein
Nov 15 '18 at 17:29
1
You should refer to this post.
– Dimeji Mudele
Nov 15 '18 at 17:41
Don't reassign the iteration variable,v
.
– hpaulj
Nov 15 '18 at 17:55
1
i
is the index.v
the value.A[i]
makes sense.A[v]
does not.
– hpaulj
Nov 15 '18 at 17:58
Note that your inner loop is awhile
, not anif
. Your list [6, 5, 4, 3, 2] gets stuck in thewhile
.
– Prune
Nov 15 '18 at 18:10
4
4
Can you provide A and n?
– Ssein
Nov 15 '18 at 17:29
Can you provide A and n?
– Ssein
Nov 15 '18 at 17:29
1
1
You should refer to this post.
– Dimeji Mudele
Nov 15 '18 at 17:41
You should refer to this post.
– Dimeji Mudele
Nov 15 '18 at 17:41
Don't reassign the iteration variable,
v
.– hpaulj
Nov 15 '18 at 17:55
Don't reassign the iteration variable,
v
.– hpaulj
Nov 15 '18 at 17:55
1
1
i
is the index. v
the value. A[i]
makes sense. A[v]
does not.– hpaulj
Nov 15 '18 at 17:58
i
is the index. v
the value. A[i]
makes sense. A[v]
does not.– hpaulj
Nov 15 '18 at 17:58
Note that your inner loop is a
while
, not an if
. Your list [6, 5, 4, 3, 2] gets stuck in the while
.– Prune
Nov 15 '18 at 18:10
Note that your inner loop is a
while
, not an if
. Your list [6, 5, 4, 3, 2] gets stuck in the while
.– Prune
Nov 15 '18 at 18:10
|
show 3 more comments
3 Answers
3
active
oldest
votes
I reproduced this with [2, 10, -5].
The detailed sequence of operations is
i, v = 0, 2
1 <= 2 ? OK
2 != A[1] ? OK ... stay in loop
v, A[v-1] = 10, 2
# This assignment breaks into ...
v = 10
A[10-1] = 2
# ... and this second assignment is out of range.
If you switch the assignment order:
A[v-1], v = 2, 10
# This assignment breaks into ...
A[2-1] = 2
v = 10
In this case, your while
conditions have properly guarded a legal assignment.
Note that you are not swapping list values; v
is a local variable; it is not a reference to A[i]. For instance, in the above example, you do get v=10
, but this does not affect the value of A[0].
add a comment |
Python swaps the variables in the order provided, so v
is assigned the value at A[v-1]
, and then tries to reassign A[v-1]
- but since v has been modified to be a list element, v-1
is out of range of A
.
Then, why the opposite doesn't cause the problem, i.e.A[v-1]
set tov
first, thenv
still gets the previousA[v-1]
value from before the update.
– kaiserasif
Nov 15 '18 at 17:44
1
Because you have an if statement ensuring thatv
is less than the length of the array, soA[v-1]
is always set to a value that can indexA
in the next step.
– Tim
Nov 15 '18 at 17:57
add a comment |
A = [6, 5, 4, 3, 2]
for i, v in enumerate(A):
while 1<=v<=len(A) and v != A[v-1]:
v, A[v-1] = A[v-1], v
You need to try running out your algorithm in your head:
Start:
i = 0, v = 6
v(6) is not between 1 and 5: next iteration
i = 1, v = 5, A[5-1] = 2
5 is between 1 and 5; v is not equal to 2: swap ->
v = 2; A[4] = 2
i = 1, v = 2, A[2-1] = 5
2 is between 1 and 5; v is not equal to 5: swap ->
v = 5; A[1] = 5
i = 1, v = 5, A[5-1] = 2
5 is between 1 and 5; v is not equal to 2: swap ->
v = 2; A[4] = 2
i = 1, v = 2, A[2-1] = 5
2 is between 1 and 5; v is not equal to 5: swap ->
v = 5; A[1] = 5
... and on and on
I don't think your algorithm makes sense. It's unclear why you are using the values in your list to index the list during your loop. I think this confusion about the index and values is at the root of your problem.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53324839%2flist-value-swapping-whats-the-correct-order-and-why%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
I reproduced this with [2, 10, -5].
The detailed sequence of operations is
i, v = 0, 2
1 <= 2 ? OK
2 != A[1] ? OK ... stay in loop
v, A[v-1] = 10, 2
# This assignment breaks into ...
v = 10
A[10-1] = 2
# ... and this second assignment is out of range.
If you switch the assignment order:
A[v-1], v = 2, 10
# This assignment breaks into ...
A[2-1] = 2
v = 10
In this case, your while
conditions have properly guarded a legal assignment.
Note that you are not swapping list values; v
is a local variable; it is not a reference to A[i]. For instance, in the above example, you do get v=10
, but this does not affect the value of A[0].
add a comment |
I reproduced this with [2, 10, -5].
The detailed sequence of operations is
i, v = 0, 2
1 <= 2 ? OK
2 != A[1] ? OK ... stay in loop
v, A[v-1] = 10, 2
# This assignment breaks into ...
v = 10
A[10-1] = 2
# ... and this second assignment is out of range.
If you switch the assignment order:
A[v-1], v = 2, 10
# This assignment breaks into ...
A[2-1] = 2
v = 10
In this case, your while
conditions have properly guarded a legal assignment.
Note that you are not swapping list values; v
is a local variable; it is not a reference to A[i]. For instance, in the above example, you do get v=10
, but this does not affect the value of A[0].
add a comment |
I reproduced this with [2, 10, -5].
The detailed sequence of operations is
i, v = 0, 2
1 <= 2 ? OK
2 != A[1] ? OK ... stay in loop
v, A[v-1] = 10, 2
# This assignment breaks into ...
v = 10
A[10-1] = 2
# ... and this second assignment is out of range.
If you switch the assignment order:
A[v-1], v = 2, 10
# This assignment breaks into ...
A[2-1] = 2
v = 10
In this case, your while
conditions have properly guarded a legal assignment.
Note that you are not swapping list values; v
is a local variable; it is not a reference to A[i]. For instance, in the above example, you do get v=10
, but this does not affect the value of A[0].
I reproduced this with [2, 10, -5].
The detailed sequence of operations is
i, v = 0, 2
1 <= 2 ? OK
2 != A[1] ? OK ... stay in loop
v, A[v-1] = 10, 2
# This assignment breaks into ...
v = 10
A[10-1] = 2
# ... and this second assignment is out of range.
If you switch the assignment order:
A[v-1], v = 2, 10
# This assignment breaks into ...
A[2-1] = 2
v = 10
In this case, your while
conditions have properly guarded a legal assignment.
Note that you are not swapping list values; v
is a local variable; it is not a reference to A[i]. For instance, in the above example, you do get v=10
, but this does not affect the value of A[0].
edited Nov 15 '18 at 18:06
answered Nov 15 '18 at 17:56
PrunePrune
45.2k143559
45.2k143559
add a comment |
add a comment |
Python swaps the variables in the order provided, so v
is assigned the value at A[v-1]
, and then tries to reassign A[v-1]
- but since v has been modified to be a list element, v-1
is out of range of A
.
Then, why the opposite doesn't cause the problem, i.e.A[v-1]
set tov
first, thenv
still gets the previousA[v-1]
value from before the update.
– kaiserasif
Nov 15 '18 at 17:44
1
Because you have an if statement ensuring thatv
is less than the length of the array, soA[v-1]
is always set to a value that can indexA
in the next step.
– Tim
Nov 15 '18 at 17:57
add a comment |
Python swaps the variables in the order provided, so v
is assigned the value at A[v-1]
, and then tries to reassign A[v-1]
- but since v has been modified to be a list element, v-1
is out of range of A
.
Then, why the opposite doesn't cause the problem, i.e.A[v-1]
set tov
first, thenv
still gets the previousA[v-1]
value from before the update.
– kaiserasif
Nov 15 '18 at 17:44
1
Because you have an if statement ensuring thatv
is less than the length of the array, soA[v-1]
is always set to a value that can indexA
in the next step.
– Tim
Nov 15 '18 at 17:57
add a comment |
Python swaps the variables in the order provided, so v
is assigned the value at A[v-1]
, and then tries to reassign A[v-1]
- but since v has been modified to be a list element, v-1
is out of range of A
.
Python swaps the variables in the order provided, so v
is assigned the value at A[v-1]
, and then tries to reassign A[v-1]
- but since v has been modified to be a list element, v-1
is out of range of A
.
answered Nov 15 '18 at 17:35
TimTim
1,772621
1,772621
Then, why the opposite doesn't cause the problem, i.e.A[v-1]
set tov
first, thenv
still gets the previousA[v-1]
value from before the update.
– kaiserasif
Nov 15 '18 at 17:44
1
Because you have an if statement ensuring thatv
is less than the length of the array, soA[v-1]
is always set to a value that can indexA
in the next step.
– Tim
Nov 15 '18 at 17:57
add a comment |
Then, why the opposite doesn't cause the problem, i.e.A[v-1]
set tov
first, thenv
still gets the previousA[v-1]
value from before the update.
– kaiserasif
Nov 15 '18 at 17:44
1
Because you have an if statement ensuring thatv
is less than the length of the array, soA[v-1]
is always set to a value that can indexA
in the next step.
– Tim
Nov 15 '18 at 17:57
Then, why the opposite doesn't cause the problem, i.e.
A[v-1]
set to v
first, then v
still gets the previous A[v-1]
value from before the update.– kaiserasif
Nov 15 '18 at 17:44
Then, why the opposite doesn't cause the problem, i.e.
A[v-1]
set to v
first, then v
still gets the previous A[v-1]
value from before the update.– kaiserasif
Nov 15 '18 at 17:44
1
1
Because you have an if statement ensuring that
v
is less than the length of the array, so A[v-1]
is always set to a value that can index A
in the next step.– Tim
Nov 15 '18 at 17:57
Because you have an if statement ensuring that
v
is less than the length of the array, so A[v-1]
is always set to a value that can index A
in the next step.– Tim
Nov 15 '18 at 17:57
add a comment |
A = [6, 5, 4, 3, 2]
for i, v in enumerate(A):
while 1<=v<=len(A) and v != A[v-1]:
v, A[v-1] = A[v-1], v
You need to try running out your algorithm in your head:
Start:
i = 0, v = 6
v(6) is not between 1 and 5: next iteration
i = 1, v = 5, A[5-1] = 2
5 is between 1 and 5; v is not equal to 2: swap ->
v = 2; A[4] = 2
i = 1, v = 2, A[2-1] = 5
2 is between 1 and 5; v is not equal to 5: swap ->
v = 5; A[1] = 5
i = 1, v = 5, A[5-1] = 2
5 is between 1 and 5; v is not equal to 2: swap ->
v = 2; A[4] = 2
i = 1, v = 2, A[2-1] = 5
2 is between 1 and 5; v is not equal to 5: swap ->
v = 5; A[1] = 5
... and on and on
I don't think your algorithm makes sense. It's unclear why you are using the values in your list to index the list during your loop. I think this confusion about the index and values is at the root of your problem.
add a comment |
A = [6, 5, 4, 3, 2]
for i, v in enumerate(A):
while 1<=v<=len(A) and v != A[v-1]:
v, A[v-1] = A[v-1], v
You need to try running out your algorithm in your head:
Start:
i = 0, v = 6
v(6) is not between 1 and 5: next iteration
i = 1, v = 5, A[5-1] = 2
5 is between 1 and 5; v is not equal to 2: swap ->
v = 2; A[4] = 2
i = 1, v = 2, A[2-1] = 5
2 is between 1 and 5; v is not equal to 5: swap ->
v = 5; A[1] = 5
i = 1, v = 5, A[5-1] = 2
5 is between 1 and 5; v is not equal to 2: swap ->
v = 2; A[4] = 2
i = 1, v = 2, A[2-1] = 5
2 is between 1 and 5; v is not equal to 5: swap ->
v = 5; A[1] = 5
... and on and on
I don't think your algorithm makes sense. It's unclear why you are using the values in your list to index the list during your loop. I think this confusion about the index and values is at the root of your problem.
add a comment |
A = [6, 5, 4, 3, 2]
for i, v in enumerate(A):
while 1<=v<=len(A) and v != A[v-1]:
v, A[v-1] = A[v-1], v
You need to try running out your algorithm in your head:
Start:
i = 0, v = 6
v(6) is not between 1 and 5: next iteration
i = 1, v = 5, A[5-1] = 2
5 is between 1 and 5; v is not equal to 2: swap ->
v = 2; A[4] = 2
i = 1, v = 2, A[2-1] = 5
2 is between 1 and 5; v is not equal to 5: swap ->
v = 5; A[1] = 5
i = 1, v = 5, A[5-1] = 2
5 is between 1 and 5; v is not equal to 2: swap ->
v = 2; A[4] = 2
i = 1, v = 2, A[2-1] = 5
2 is between 1 and 5; v is not equal to 5: swap ->
v = 5; A[1] = 5
... and on and on
I don't think your algorithm makes sense. It's unclear why you are using the values in your list to index the list during your loop. I think this confusion about the index and values is at the root of your problem.
A = [6, 5, 4, 3, 2]
for i, v in enumerate(A):
while 1<=v<=len(A) and v != A[v-1]:
v, A[v-1] = A[v-1], v
You need to try running out your algorithm in your head:
Start:
i = 0, v = 6
v(6) is not between 1 and 5: next iteration
i = 1, v = 5, A[5-1] = 2
5 is between 1 and 5; v is not equal to 2: swap ->
v = 2; A[4] = 2
i = 1, v = 2, A[2-1] = 5
2 is between 1 and 5; v is not equal to 5: swap ->
v = 5; A[1] = 5
i = 1, v = 5, A[5-1] = 2
5 is between 1 and 5; v is not equal to 2: swap ->
v = 2; A[4] = 2
i = 1, v = 2, A[2-1] = 5
2 is between 1 and 5; v is not equal to 5: swap ->
v = 5; A[1] = 5
... and on and on
I don't think your algorithm makes sense. It's unclear why you are using the values in your list to index the list during your loop. I think this confusion about the index and values is at the root of your problem.
answered Nov 15 '18 at 18:07
vaer-kvaer-k
3,94852335
3,94852335
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53324839%2flist-value-swapping-whats-the-correct-order-and-why%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
4
Can you provide A and n?
– Ssein
Nov 15 '18 at 17:29
1
You should refer to this post.
– Dimeji Mudele
Nov 15 '18 at 17:41
Don't reassign the iteration variable,
v
.– hpaulj
Nov 15 '18 at 17:55
1
i
is the index.v
the value.A[i]
makes sense.A[v]
does not.– hpaulj
Nov 15 '18 at 17:58
Note that your inner loop is a
while
, not anif
. Your list [6, 5, 4, 3, 2] gets stuck in thewhile
.– Prune
Nov 15 '18 at 18:10