Список слайсов в python - PullRequest
1 голос

Мне нужно нарезать список с помощью python 3.7, и срез должен содержать два элемента, если в конце мы получили один элемент (как показано ниже), то последний элемент должен go к предыдущей части.

def solution(A):
    l = len(A)
    size = 2
    for i in range(1, len(A), size):
        print(A[i:i+2])

solution([4,2,2,5,1,5,8,9])  

Вывод:

[2, 2]
[5, 1]
[5, 8]
[9]

Желание вывод:

[2, 2]
[5, 1]
[5, 8, 9]

Спасибо за помощь

Ответы [ 6 ]

3 голосов
/ 03 мая 2020
def solution(A):
    l = len(A)
    size = 2
    groups = [ A[i:i+size] for i in range(1, len(A), size) ]
    if len(groups[-1]) < size:
       groups[-2].extend(groups.pop())
    for x in groups:
        print(x)

Работает для любого значения размера, а не только 2.

1 голос
/ 03 мая 2020

Эта функция сделает свое дело (я не очень доволен этим, и я уверен, что там должен быть лучший выход, но пока он подойдет).

def listSlicing(raw_list, slice_length):

    # Get the number of elements that will be left out when the list is sliced 
    extra_elements = len(raw_list)%slice_length 

    # Create a list of slices. Do not go to the last element
    sliced_list = [raw_list[i:i+slice_length] for i in range(0, len(raw_list)-extra_elements, slice_length)] 

    # Access the last item of the sliced list and append the extra elements to it
    if extra_elements == 0:
        return sliced_list # No need to change the last value
    else:
        sliced_list[-1].extend(raw_list[-extra_elements:]) 
        return sliced_list

l = [4,2,2,5,1,5,8,9,10]
listSlicing(l, 2)
# Will return [[4, 2], [2, 5], [1, 5], [8, 9, 10]]

В случае, если есть место только для одного слайса (например, предположим, что slice_length 5 вместо 2), функция вернет только один список, так как после создания первого слайса оставшиеся 4 элемента (5, 8, 9, 10) будет добавлен к самому первому срезу, фактически возвращая тот же список снова.

1 голос
/ 03 мая 2020

Вы можете просто проверить, будет ли следующая итерация l oop слишком длинным go, и если это так, вывести весь список и остановиться.

Примерно так

def solution(A):
    l = len(A)
    size = 2
    for i in range(1, len(A), size):
        print(i)
        if i+2*size > len(A):
            print(A[i:])
            break
        else:
            print(A[i:i+2])
1 голос
/ 03 мая 2020

Вы можете попробовать это.

Работает для любых size

>>> def chunks(a):
...     size=2
...     b=[a[i:i+size] for i in range(1,len(a),size)]
...     if len(b[-1])<size:
...             *b,l=b
...             b[-1]+=l
...     return b
...
>>> chunks(a)
[[2, 2], [5, 1], [5, 8, 9]]
1 голос
/ 03 мая 2020
def solution(A):
    l = len(A)
    size = 2
    for i in range(0, len(A), size):
        if l%2!=1 and i==l-3:  #if the length is odd and i is the third last
            print(A[i:i+3])
            break
        else:
            print(A[i:i+2])

solution([4,2,2,5,1,5,8,9])
0 голосов
/ 03 мая 2020
def func(a, size):
    c=[]
    if size==0 or size<0:
        return []
    if size>=len(a):
        return a 
    c = [a[i:i+size] for i in range(0,(len(a)//size)*size,size) if i%size==0] 
    c[-1].extend(a[(len(a)//size)*size:])
    return c

a = [4,2,2,5,1,5,8,9, 10]
print(func(a, 2))
print(func(a, 111))
print(func(a, 9))
print(func(a, 5))

выход

[[4, 2], [2, 5], [1, 5], [8, 9, 10]]
[4, 2, 2, 5, 1, 5, 8, 9, 10]
[4, 2, 2, 5, 1, 5, 8, 9, 10]
[[4, 2, 2, 5, 1, 5, 8, 9, 10]]
...