在Python中执行Triple Cut

时间:2015-11-15 03:38:52

标签: python

我需要进行三重切割。我的函数作为int的参数列表,在该列表的某个地方有27和28.我需要做的是检查27或28之前的内容,27或28之前的所有内容(取决于先来的内容)转到列表的底部以及27或28之后的所有内容(取决于第二个内容将位于列表顶部。

以下是一个例子:

>>> test_list = [1, 28, 3, 4, 27, 5, 6, 7, 8]
>>> triple_cut(test_list)
>>> test_list = [5, 6, 7, 8, 28, 3, 4, 27, 1]

这是我到目前为止所拥有的

#find the index positions of the two jokers
find_joker1 = deck.index(27)
find_joker2 = deck.index(28)
print(find_joker1, find_joker2)

new_list = []

# use selection to check which joker occurs first
if(find_joker1 > find_joker2): # joker2(28) occurs first in the list

# loop throgh each element in the list that occurs before Joker1
# and move them to the end of the list
# move element that occur after Joker1(27) to the top of the list
    for i in deck:
        if(deck.index(i) > find_joker1): # elements that occur after second joker
            new_list.append(i) # move those element to the top of the list
            new_list.append(28) # add Joker2


            for i in deck: # element between the two Jokers
                if(deck.index(i) > find_joker2 and deck.index(i) < find_joker1):
                    new_list.append(i)
                    new_list.append(27)


            for i in deck: # elements before the first joker
                if(deck.index(i) < find_joker2):
                    new_list.append(i)
print(new_list)

2 个答案:

答案 0 :(得分:3)

可以通过切片来解决。

def triple_cut(lst):
    a=lst.index(27)
    b=lst.index(28)
    if a>b:
        return lst[a+1:]+ lst[b:a+1]+ lst[:b]

    else:
        return lst[b+1:]+ lst[a:b+1]+ lst[:a]    

究竟发生了什么:

  • 在索引较大的索引之后切片。
  • 从较低的索引切片到较高索引的切片。
  • 在较低的索引编辑之前切片。
  • 全部加在一起。

N.B:在切片期间,第一个索引是包含的,第二个索引是独占的。

演示,

>>test_list = [1, 28, 3, 4, 27, 5, 6, 7, 8] 
>>tripplecut(test_list)
[5, 6, 7, 8, 27, 3, 4, 28, 1]

一些解释:

通过切片,您可以获得列表的一部分。首先看看实际切片是如何工作的:

lst[start:end:increment]

要与您的问题相关,请跳过增量部分。默认增量为1,正是我们需要的。因此,我们将切片如下列表:

lst[start:end]

让我们对您的列表进行一些实验。

>>> test_list = [1, 28, 3, 4, 27, 5, 6, 7, 8]

说,我们想要一个从索引2(3)到索引5(27)的列表。只需:

>>> test_list[2:6]
[3,4,27]

为什么我用6来代替5.那是因为:

  

如果是切片, start 索引是包含在内的,但 end 索引是独占的。

如果我们想要从开始到索引4(27)的列表怎么办?做:

>> test_list[:5]
[1,28,3,4,27]

如果我们希望索引3结束?只需:

>>test_list[3:]
[4, 27, 5, 6, 7, 8]

希望能帮到你一点。

答案 1 :(得分:0)

由于你实际上并不需要知道哪个是哪个,你可以找到两个索引和切片。

def triple_cut(lst):
    first, second = [i for i, e in enumerate(lst) if e in [27, 28]]
    return lst[second+1:] + lst[first:second+1]+ lst[:first]