Циклически отображать сгруппированный список элементов из списка python - PullRequest
8 голосов
/ 01 августа 2020

У меня есть массив, учитывая количество элементов в группе и количество групп, мне нужно печатать массив циклически в al oop. Массив- [1,2,3,4,5,6] Группа- 4 Итерации- 7

Результат должен быть:

['1', '2', '3', '4']
['5', '6', '1', '2']
['3', '4', '5', '6']
['1', '2', '3', '4']
['5', '6', '1', '2']
['3', '4', '5', '6']
['1', '2', '3', '4']

Ответы [ 10 ]

11 голосов
/ 01 августа 2020

np.resize здесь удобно:

np.resize([1,2,3,4,5,6],(7,4))
# array([[1, 2, 3, 4],
#        [5, 6, 1, 2],
#        [3, 4, 5, 6],
#        [1, 2, 3, 4],
#        [5, 6, 1, 2],
#        [3, 4, 5, 6],
#        [1, 2, 3, 4]])
7 голосов
/ 01 августа 2020

Это один из способов сделать это. Я дважды создаю более длинный список, состоящий из входного массива, примерно так:

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

Затем разрезаю его от начального индекса i до i+N (N - размер группы , В данном случае 4).

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

N = 4 # Number of elements in a group

aa = a+a # create a list composed of the array 'a' twice

i = 0 # starting index

for loop in range(7):
    # extract the elements from the doublelist
    print(aa[i:i+N])

    # The next starting point has to be within the range of array 'a'
    i = (i+N)%len(a)

Вывод:

[1, 2, 3, 4]
[5, 6, 1, 2]
[3, 4, 5, 6]
[1, 2, 3, 4]
[5, 6, 1, 2]
[3, 4, 5, 6]
[1, 2, 3, 4]
5 голосов
/ 01 августа 2020

Одно из решений - объединить itertools.cycle с itertools.slice.

from itertools import cycle, islice

def format_print(iterable, group_size, iterations):
    iterable = cycle(iterable)
    for _ in range(iterations):
        print(list(islice(iterable, 0, group_size)))

format_print(range(1, 7), 4, 7)

Вывод:

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

Если требуется распечатать списки строк, cycle(iterable) может быть заменено на cycle(map(str, iterable)).

5 голосов
/ 01 августа 2020

Вы можете попробовать следующее, в котором используется itertools.cycle:

import itertools

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

number_of_elms_in_a_group = 4
iteration_number = 7

groups = []
group = []
for i, x in enumerate(itertools.cycle(t)):
    if len(groups) >= iteration_number:
        break
    if i % number_of_elms_in_a_group == 0 and i != 0:
        groups.append(group)
        group = []
    group.append(x)

# At this point,
# groups == [[1, 2, 3, 4], [5, 6, 1, 2], [3, 4, 5, 6],
#            [1, 2, 3, 4], [5, 6, 1, 2], [3, 4, 5, 6],
#            [1, 2, 3, 4]]
for group in groups:
    print(group)

, который печатает

[1, 2, 3, 4]
[5, 6, 1, 2]
[3, 4, 5, 6]
[1, 2, 3, 4]
[5, 6, 1, 2]
[3, 4, 5, 6]
[1, 2, 3, 4]
2 голосов
/ 01 августа 2020

Если скорость является проблемой, numpy может с этим справиться; однако это будет стоить памяти

import numpy as np

arr = [1,2,4,5,6]
iteration = 7
group = 4

np.array([arr]*(group+2)).flatten().reshape(-1, group)[:it]

[[1, 2, 3, 4],
[5, 6, 1, 2],
[3, 4, 5, 6],
[1, 2, 3, 4],
[5, 6, 1, 2],
[3, 4, 5, 6],
[1, 2, 3, 4]])
1 голос
/ 07 августа 2020

Я вижу много решений, но предлагаю вам решение без использования какой-либо библиотеки. Может тебе понравится. Я создал круговой связанный_лист с помощью словаря, а затем решил проблему.

output = []


def execute(grp, iteration, linked_list):
    key = 0
    for a in range(iteration):
        l = []
        for b in range(grp):
            value = linked_list[key]["value"]
            key = linked_list[key]["key"]
            l.append(value)

        output.append(l)
    return output


def get_linked_list(Array):
    linked_list = {}
    for count, a in enumerate(Array):
        if count == len(Array) - 1:
            linked_list[count] = {"key": 0, "value": a}
        else:
            linked_list[count] = {"key": count + 1, "value": a}
    return linked_list


Array = [11, 22, 33, 44, 55,66]
Group = 4
Iterations = 7
print(execute(Group, Iterations, get_linked_list(Array)))
1 голос
/ 01 августа 2020

Получил вот это решение. Спасибо всем за отправку ответов, ваши ответы помогли мне улучшить мои знания.

from itertools import cycle

def sub_list(list_in, list_size, num_iter):
  cycle_list = cycle(list_in)
  for i in range(num_iter):
    print([str(next(cycle_list)) for i in range(list_size)])

sub_list([1,2,3,4,5,6], 4, 7)
 

Результат:

['1', '2', '3', '4']
['5', '6', '1', '2']
['3', '4', '5', '6']
['1', '2', '3', '4']
['5', '6', '1', '2']
['3', '4', '5', '6']
['1', '2', '3', '4']
1 голос
/ 01 августа 2020

Вот еще один способ сделать это без использования каких-либо библиотек:

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

number_of_elements = 4
iterations = 7

iterations_groups = []
elements_group = []

for y in range(iterations):
    for i, x in enumerate(array):
        if len(iterations_groups) == iterations:
            break
        if len(elements_group) < number_of_elements:
            elements_group.append(x)
        else:
            iterations_groups.append(elements_group)
            elements_group = []
            elements_group.append(x)

for group in iterations_groups:
    print(group)

Вывод:

[1, 2, 3, 4]
[5, 6, 1, 2]
[3, 4, 5, 6]
[1, 2, 3, 4]
[5, 6, 1, 2]
[3, 4, 5, 6]
[1, 2, 3, 4]
1 голос
/ 01 августа 2020

Другой способ (хотя и довольно очевидный). Повторите массив достаточно раз, используя tile, а затем измените его:

np.tile(array,Group*Iterations//array.size+1)[:Group*Iterations].reshape(Iterations,Group))

И если array является списком, сначала преобразуйте его в numpy array:

import numpy as np
array = np.array(array)

вывод:

[[1 2 3 4]
 [5 6 1 2]
 [3 4 5 6]
 [1 2 3 4]
 [5 6 1 2]
 [3 4 5 6]
 [1 2 3 4]]
0 голосов
/ 13 августа 2020

Вы можете сделать это только с кусочками.

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

for _ in range(7):
    print(a[0:4])
    a = a[4:] + a[0:4]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...