Python 列表交换仅适用于某些迭代
Python list swap only working on some iterations
我在 Python 中遇到交换问题 - 我想通过遍历整数列表并将任何不合适的值与应该在其中的值交换来对整数列表进行排序地方。
我知道输入将是一个未排序的连续整数列表,从 1 开始,例如[4, 3, 1, 2]
sorted = [4, 3, 1, 2]
swapCount = 0
for i in range(len(sorted)):
if sorted[i] != i + 1:
print(f"Before swap {i + 1}: {sorted}")
sorted[i], sorted[sorted.index(i + 1)] = sorted[sorted.index(i + 1)], sorted[i]
swapCount += 1
print(f"After swap {i + 1}: {sorted}")
print(swapCount)
# Before swap 1: [4, 3, 1, 2]
# After swap 1: [4, 3, 1, 2]
# Before swap 2: [4, 3, 1, 2]
# After swap 2: [4, 3, 1, 2]
# Before swap 3: [4, 3, 1, 2]
# After swap 3: [4, 1, 3, 2]
# Before swap 4: [4, 1, 3, 2]
# After swap 4: [2, 1, 3, 4]
# 4
所以在我的循环中,交换不起作用(或在某些特殊情况下起作用),而相同的语法在循环外起作用:
sorted = [4, 3, 1, 2, 5]
print(sorted)
sorted[0], sorted[2] = sorted[2], sorted[0]
print(sorted)
# [4, 3, 1, 2, 5]
# [1, 3, 4, 2, 5]
任何人都可以帮助我了解循环中出了什么问题吗?
像a, b = c, d
这样的赋值首先使用right-hand边来定义一个元组。然后第一个元素赋值给a
,然后第二个元素赋值给b
。第一个任务可能包含可能影响第二个的副作用;它们不是同时或独立发生的。
您的代码
sorted[i], sorted[sorted.index(i + 1)] = sorted[sorted.index(i + 1)], sorted[i]
等同于
t = sorted[sorted.index(i + 1)], sorted[i]
sorted[i] = t[0]
sorted[sorted.index(i+1)] = t[1]
请特别注意,在对 sorted.index
的两次调用之间是一个更改 sorted
的赋值,因此可能导致第二个 sorted.index
到 return与第一个值不同。
您想先调用 sorted.index(i+1)
并保存它的值,然后在交换中使用保存的值。
j = sorted.index(i+1)
sorted[i], sorted[j] = sorted[j], sorted[i]
我在 Python 中遇到交换问题 - 我想通过遍历整数列表并将任何不合适的值与应该在其中的值交换来对整数列表进行排序地方。 我知道输入将是一个未排序的连续整数列表,从 1 开始,例如[4, 3, 1, 2]
sorted = [4, 3, 1, 2]
swapCount = 0
for i in range(len(sorted)):
if sorted[i] != i + 1:
print(f"Before swap {i + 1}: {sorted}")
sorted[i], sorted[sorted.index(i + 1)] = sorted[sorted.index(i + 1)], sorted[i]
swapCount += 1
print(f"After swap {i + 1}: {sorted}")
print(swapCount)
# Before swap 1: [4, 3, 1, 2]
# After swap 1: [4, 3, 1, 2]
# Before swap 2: [4, 3, 1, 2]
# After swap 2: [4, 3, 1, 2]
# Before swap 3: [4, 3, 1, 2]
# After swap 3: [4, 1, 3, 2]
# Before swap 4: [4, 1, 3, 2]
# After swap 4: [2, 1, 3, 4]
# 4
所以在我的循环中,交换不起作用(或在某些特殊情况下起作用),而相同的语法在循环外起作用:
sorted = [4, 3, 1, 2, 5]
print(sorted)
sorted[0], sorted[2] = sorted[2], sorted[0]
print(sorted)
# [4, 3, 1, 2, 5]
# [1, 3, 4, 2, 5]
任何人都可以帮助我了解循环中出了什么问题吗?
像a, b = c, d
这样的赋值首先使用right-hand边来定义一个元组。然后第一个元素赋值给a
,然后第二个元素赋值给b
。第一个任务可能包含可能影响第二个的副作用;它们不是同时或独立发生的。
您的代码
sorted[i], sorted[sorted.index(i + 1)] = sorted[sorted.index(i + 1)], sorted[i]
等同于
t = sorted[sorted.index(i + 1)], sorted[i]
sorted[i] = t[0]
sorted[sorted.index(i+1)] = t[1]
请特别注意,在对 sorted.index
的两次调用之间是一个更改 sorted
的赋值,因此可能导致第二个 sorted.index
到 return与第一个值不同。
您想先调用 sorted.index(i+1)
并保存它的值,然后在交换中使用保存的值。
j = sorted.index(i+1)
sorted[i], sorted[j] = sorted[j], sorted[i]