Как перебрать список и объединить определенные элементы в Python? - PullRequest
1 голос
/ 08 ноября 2019

Предположим, у нас есть список l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ...] Я хотел бы сгруппировать элементы из этого списка так:

(1, 5, 9)
(2, 6, 10)
(3, 7, 11)
(4, 8, 12)

и так далее. (Принимая во внимание, что длина списка всегда кратна 3)

Пробовал следующее, но, конечно, это просто последовательно группирует элементы:

>>>for x, y, z in itertools.zip_longest(*[iter(lista)] * 3):
    print(x,y,z)
>>>(1 2 3)

(4 5 6)

(7 8 9)

(10 11 12)

Желаемый результат:(1, 5, 9) (2, 6, 10) (3, 7, 11) (4, 8, 12)

Обновленный вопрос Позвольте мне «модернизировать» вопрос до моего конкретного подхода: Итак, у меня есть список из 900 пустых массивов, я хотел бы сгруппировать эти массивы в подгруппы. списки, длина которых равна 3. Следовательно, будет заключительный список, содержащий 300 подсписков, где каждый подсписок содержит 3 массива. Эти массивы должны быть сгруппированы так, как указано выше. Желаемый результат, если у нас есть список из 900 чисел, должен быть: (1, 5, 9) (2, 6, 10) (3, 7, 11) (4, 8, 12) (13, 17, 21) (14, 18, 22) (15, 19, 23) (16, 20, 24) (25, 29, 33) (26, 30, 34) (27, 31, 35) (28, 32, 36)...

Ответы [ 3 ]

3 голосов
/ 08 ноября 2019

Вы можете использовать понимание списка, разрезая столько раз, сколько размер списка делится на размер шага:

step = 4
[l[i::step] for i in range(len(l)//(step-1))]
# [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
1 голос
/ 08 ноября 2019

Окончательный ответ:

Если вы не хотите повторять элементы, попробуйте вместо этого:

import numpy as np
l = list(range(1, 301))
step = 4
length = 3
size = step * length
result = np.array(l).reshape(len(l) // size, length, step).transpose(0, 2, 1).reshape(len(l) // length, length)

Результат:

array([[  1,   5,   9],
       [  2,   6,  10],
       [  3,   7,  11],
       [  4,   8,  12],
       [ 13,  17,  21],
       [ 14,  18,  22],
       [ 15,  19,  23],
       [ 16,  20,  24],
       [ 25,  29,  33],
       ...
       [277, 281, 285],
       [278, 282, 286],
       [279, 283, 287],
       [280, 284, 288],
       [289, 293, 297],
       [290, 294, 298],
       [291, 295, 299],
       [292, 296, 300]])

Обновлено Оригинальный ответ:

Исходя из уточненного требования, вы можете сделать следующее:

step = 4
result = [l[i:i+step*2+1:step] for i in range(len(l)-step*2)]

Результат:

[[1, 5, 9], 
 [2, 6, 10], 
 [3, 7, 11], 
 ...
 [290, 294, 298],
 [291, 295, 299],
 [292, 296, 300]]

Объяснение:

step = 4  # the spacing between each element in the     
                                            # ┌ loop from 0 to 2 steps before list ends (300 - 8 = 292)
result = [l[i:i+step*2+1:step] for i in range(len(l)-step*2)]
#         │ │ │          └ skip every step (4)
#         │ │ └ end after step occured twice (8); the +1 is needed because end index is not returned.
#         │ └ start from index i (0, 1, 2,... 291, 292)
#         └ slice list l into a triplet

Оригинальный ответ:

Поскольку вы уже используете numpy для 900 элементов, вы можете просто сделать это:

np.array(l).reshape(3, len(l)//3).T

, что дает вам:

array([[ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11],
       [ 4,  8, 12]])

Если вынужно обратно как list вы можете просто сделать .tolist():

np.array(l).reshape(3, len(l) //3).T.tolist()
# [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
1 голос
/ 08 ноября 2019

Оригинальный ответ

Вы можете добиться того же, используя list slicing и простой for цикл в диапазоне

# Input
set_of_data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
# Capture every 4th element in a sequence starting from 0th index, hence set number_of_rows = 4
number_of_rows = 4
# Loop through the range(4) --> [0,1,2,3] and each time collect data by jumping 4 positions
res = [set_of_data[i::number_of_rows] for i in range(number_of_rows)]
# Printing result
print (res)
# Output
# [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

Надеюсь, это поможет и рассчитывает!

Обновлен ответ в соответствии с запросом.

    # Input
set_of_data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,14,15,16,17,18, 19,20,21,22,23,24]
# Defining variables
len_of_data = len(set_of_data)
number_of_rows = 4
number_of_group = 12

# Main code
res = [ tuple(set_of_data[i:i+number_of_group][j::number_of_rows])  for  i in range(0,len_of_data, number_of_group) for j in range(number_of_rows) ]

# Output
print (res)
# [(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12), (13, 17, 21), (14, 18, 22), (15, 19, 23), (16, 20, 24)]

Я прошу вас закрыть ответ, если вы удовлетворены каким-либо из ответов.

...