【问题标题】:how can i cut a list and reverse the two halves?我怎样才能剪掉一个列表并将两半颠倒?
【发布时间】:2017-10-21 04:45:36
【问题描述】:

例如,如果我输入一个带有列表和索引的函数,我该如何对其进行编码,以便它返回一个切成两半并使用循环交换位置的列表

function([0,1,2,3,4], 2)

返回

[3, 4, 2, 0, 1]

我试过了:

def function(list_value):
    first_half = list_value[:index] 
    second_half = list_value[(index+1):] 
    swapped_sequence = second_half + first_half 
    swapped_sequence = swapped_sequence.insert(index, index) 
    return swapped_sequence

【问题讨论】:

  • 为什么2不倒过来?
  • 到目前为止必须尝试什么?请发布您的代码。
  • first_half = list_value[:index] second_half = list_value[(index+1):] swapped_sequence = second_half + first_half swapped_sequence = swapped_sequence.insert(index, index) return swapped_sequence
  • @DaquarisGeorgino 这似乎是对所提问题的合理解决方案请更新当前和预期的输出?
  • 你的输出列表没有减半。

标签: python list slice


【解决方案1】:

这是一个基本版本,只需使用列表索引并加入 3 个部分。

def cut(x, i):
    try:
        return x[i + 1:] + x[i:i + 1] + x[:i]  
    except IndexError:  
        return []

【讨论】:

  • 我可能是错的,对于这个例子它不会影响性能,但是访问切片是 O(k) 复杂度,而获取一个元素是 O(1) 并且附加一个元素是 O (1),那么简单地查找中间元素不是更有效吗?
  • @chris 查找中间元素后你会怎么做?另外,我认为附加是线性的,因为不幸的是空间分配。
  • 追加是一个 O(1) 操作。我只是想用[x[i]] 替换x[i: i + 1]。然而,finally 连接将运行时间限制在 O(n) 上,这是切片查找的最坏情况,所以这真的没关系。
  • 使用切片:713 ns ± 5.68 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)。使用查找:640 ns ± 13.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
【解决方案2】:

虽然不是更快,但我们可以使用 np.roll:

import numpy as np

def function(lst,ind):
    roll = np.roll(lst, ind)[:-1]
    lst_n = np.insert(roll, ind, ind)
    return lst_n

function([0,1,2,3,4,5,6], 2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2010-11-21
    • 2018-08-29
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多