#python #loops
#python #циклы
Вопрос:
Моя проблема в том, что в python у меня есть список из 1000 чисел. Я хочу выбрать первые 20 и сохранить в «A» (другой список), а следующие 30 в «B» (другой список), снова следующие 20 в «A», следующие 30 в «B», пока список не закончится. Как это сделать? Кто-нибудь может помочь, пожалуйста?
Комментарии:
1.
store in "A"
… что такоеA
?2. @Tim Biegeleisen… это другой список
Ответ №1:
Для этого можно использовать понимание двух вложенных списков:
nums = list(range(2000))
A = [x for i in range( 0, len(nums), 50) for x in nums[i:i 20]]
B = [x for i in range(20, len(nums), 50) for x in nums[i:i 30]]
Это означает (для A
): начиная с индекса 0, 50, 100 и т.д., возьмите следующие 20 элементов и добавьте их A
. Аналогично для B
. Вы также можете использовать itertools.islice
for the nums[i:i n]
part, чтобы избежать создания множества временных вложенных списков.
Конечно, это предполагает, что A
и B
уже не существует. Если они есть, и вы хотите добавить к ним элементы, используйте обычный цикл и extend
(не проверено):
for i in range(0, len(nums), 50):
A.extend(nums[i :i 20])
B.extend(nums[i 20:i 50])
Вам не нужно снова проверять индексы внутри цикла; если i 20
он уже больше последнего индекса в списке, B
он просто будет расширен с помощью пустого списка на последнем шаге.
Ответ №2:
Я создал функцию, которая может делать то, о чем вы просите
def split_list(lst, gap1, gap2):
tmp = lst.copy()
out1, out2 = [], []
while tmp:
out1.extend(tmp[:gap1])
tmp = tmp[gap1:]
out2.extend(tmp[:gap2])
tmp = tmp[gap2:]
return out1, out2
gap1
и gap2
— это длина каждого подмножества, которое вы хотите сохранить, так что в вашем случае gap1=20
и gap2=30
.
Пример
numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
A, B = split_list(numbers, 2, 3)
print(A)
print(B)
Ответ №3:
Давайте сначала определим следующее:
A = [] #empty list
B = [] #empty list
И давайте назовем ваш первый список (который включает 1000 чисел), как my_list
.
Тогда простое решение может быть следующим:
counter = 0
c_a = 2
c_b = 3
while (counter < len(my_list)):
A = A my_list[counter:counter c_a]
B = B my_list[counter c_a : counter c_a c_b]
counter = counter c_a c_b
Ответ №4:
Я предлагаю создать 2D вложенный список, который содержит подсписки, каждый из которых содержит 20 элементов. Вот однострочный способ сделать это с пониманием списка:
x = range(1, 1001)
output = [x[idx*20:(idx*20 20)] for idx in range(0, len(x) / 20)]
Вот версия, которая работает с меньшим набором данных, для демонстрационных целей:
x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
output = [x[idx*3:(idx*3 3)] for idx in range(0, len(x) / 3)]
print(output) # [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Комментарии:
1. Почему не
range
сstep
помощью вместоidx*X
? В частности, это может вызвать ошибку TypeError, если список неравномерно делится на 20 или 3.2. @tobias_k Я новичок в Python (несмотря на то, что я на расстоянии 5 голосов от золотой медали в этом теге). Вы можете отредактировать мой вопрос, если хотите.