分享
三行代码  ›  专栏  ›  技术社区  ›  Eniola

弯曲数组超出索引,但在某些情况下工作正常

  •  1
  • Eniola  · 技术社区  · 1 周前

    我正试着绕着一个阵。

         a = [1,2,3,4,5,6]
    

    我想要这样的输出:

         output = [6,1,5,2,4,3]
    

    我有密码,但不是所有情况下都有效。

    这是我的密码副本

    def meanderingArray(arr) : 
        n = len(arr)
        arr.sort() 
      
        tempArr = [0] * (n + 1) 
      
        ArrIndex = 0
    
        i = 0
        j = n-1
          
        while(i <= n // 2 or j > n // 2 ) : 
          
            tempArr[ArrIndex] = arr[j] 
            ArrIndex = ArrIndex + 1
            tempArr[ArrIndex] = arr[i] 
            ArrIndex = ArrIndex + 1
            i = i + 1
            j = j - 1
        for i in range(0, n) : 
            arr[i] = tempArr[i] 
        return arr
          
    
    meanderingArray([22231,44423,66574,-14122,-12322,14476])
    
    
    IndexError                                Traceback (most recent call last)
    <ipython-input-28-8993ecc448e2> in <module>
    ----> 1 meanderingArray([22231,44423,66574,-14122,-12323,14476])
    
    <ipython-input-26-24690fd05e2d> in meanderingArray(arr)
         14         tempArr[ArrIndex] = arr[j]
         15         ArrIndex = ArrIndex + 1
    ---> 16         tempArr[ArrIndex] = arr[i-1]
         17         ArrIndex = ArrIndex + 1
         18         i = i + 1
    
    IndexError: list assignment index out of range
    
    
    Anything I can adjust in the code?
    
    Thanks
    
    5 回复  |  直到 1 周前
        1
  •  0
  •   Frank Yellin    1 周前

    当数组的长度为奇数时,您的代码将无法工作。您将抓取中间元素两次,一次使用 i 一旦使用 j ,然后追加两次。如果你写的是:

    tempArray = []
    while.....
        tempArray.append(arr[j])
        tempArray.append(arr[i])
        ...
    

    您将看到中间元素被添加了两次,而不是得到AIOOB异常。如果i==j,你需要提前中止

        2
  •  1
  •   Karl Knechtel    1 周前

    我可以更简单地通过使用切片来实现:

    def meander(l):
        l.sort()
        odd_count = len(l) // 2
        even_count = len(l) - odd_count
        l[::2], l[1::2] = l[:-(even_count + 1):-1], l[:odd_count]
    

    (由于列表已经过适当的修改,所以Python约定是 返回值。)

    说明:我们确定有多少个奇数和偶数索引(因为列表是0索引的,所以第一个位置是偶数),然后同时将适当的值放入偶数位置(从末尾向后取)和奇数位置(从前面向前)。

        3
  •  0
  •   Steve    1 周前

    def meanderingArray(arr):
        n = len(arr)
        arr.sort()
    
        tempArr = [0] * (n + 1)
    
        ArrIndex = 0
    
        i = 0
        j = n - 1
    
        while (i <= n // 2 or j > n // 2):
            print("{} {} {}".format(i, j, ArrIndex))
            tempArr[ArrIndex] = arr[j]
            ArrIndex = ArrIndex + 1
            if ArrIndex < len(tempArr):
                tempArr[ArrIndex] = arr[i]
            ArrIndex = ArrIndex + 1
            i = i + 1
            j = j - 1
        for i in range(0, n):
            arr[i] = tempArr[i]
        return arr
    
    
    print(meanderingArray([22231, 44423, 66574, -14122, -12322, 14476]))
    
        4
  •  0
  •   blhsing    1 周前

    对于一个有效的解决方案,您可以压缩 a 以相反的顺序 itertools.islice ,并使用 itertools.chain.from_iterable :

    from itertools import chain, islice
    list(chain.from_iterable(islice(zip(reversed(a), a), len(a) // 2)))
    

    [6, 1, 5, 2, 4, 3]
    
        5
  •  -1
  •   Scott Boston    1 周前

    下面是一个有趣的答案:

    sum([list(i) if i[0] != i[1] else [i[0]] 
         for i in zip(sorted(a, reverse=True), sorted(a))][:round(len(a)/2+.01)], 
        [])
    

    什么时候,

    a = [1,2,3,4,5,6]
    
    [6, 1, 5, 2, 4, 3]
    

    a = [1,2,3,4,5,6,7]
    
    [7, 1, 6, 2, 5, 3, 4]