繁体   English   中英

Python:检查列表是否可以通过交换两个元素进行排序,只允许交换一次

[英]Python: check if a list can be sorted by swapping two elements, only one swap is allowed

在下面的代码中,我试图找出左侧是否有两个大于右侧元素的元素,但这似乎不适用于我的问题。 有什么提示可以写出更多的逻辑吗? 我被困在这里。

交换文件

def swap(lst):
    count = 0
    for k in range(0, len(lst)-1):
        if lst[k] > lst[k+1]:
            count += 1
    if int(count) == 2:
        print "Swapped"
    elif int(count) == 0:
        print True
    else:
        print False


if __name__ == "__main__":
    swap([1,2,3,4,0])
    swap([6,4,2,5])
    swap([6,4,2,8])
    swap([1,4,5])

我预期的程序输出 -

[1,4,5] will return True
[6,4,2,8] will return Swapped
[6,4,2,5] will return False
from itertools import combinations
def is_swappable(lst):
    s = sorted(lst)
    for i, j in combinations(range(len(lst)), 2):
        l = lst[:]
        l[i], l[j] = l[j], l[i]
        if l == s:
            return True
    return False

这是一个非常幼稚的解决方案。 尝试交换列表中的每一对,看看是否会导致排序列表。

我不理解“交换”条件,但以下代码片段会告诉您是否可以在一次交换中对数组进行排序。 代码是用 Python 3 编写的,这段代码的复杂度是 O(nlog(n))

def checkOneSwap(arr):
    N = len(arr)
    if N <= 2:
        print(True)

    arr2 = []
    for index in range(N):
        arr2.append(arr[index])
    arr2.sort()
    counter = 0
    for i in range(N):
        if arr[i] != arr2[i]:
            counter += 1

    if counter == 0 or counter == 2:
        print(True)
    else:
        print(False)

checkOneSwap([1,2,3,4,0])   # False    you definetly need for than 2 swap to make this array sorted
checkOneSwap([6,4,2,5])     # False    [2,4,5,6] -> swap(6,2) and then swap(6,5) require 2 swap to make this array sorted 
checkOneSwap([6,4,2,8])     # True     [2,4,6,8] -> swap(6,2), one swap required to make this array sorted
checkOneSwap([1,4,5])       # True     [1,4,5]  -> already sorted,counter = 0

可以用 for 循环来完成,但我更喜欢列表理解。 压缩排序和未排序列表并创建不匹配列表。 如果不匹配的长度超过 2,那么你不能在 1 交换中排序。

def is_sortable_by_one_swap(unsorted_list):
    mismatches = [x for x in zip(unsorted_list, sorted(unsorted_list)) if x[0] != x[1]]
    return False if len(mismatches) > 2 else True

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM