Цикл для выбора определенных чисел из заданного списка

#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 голосов от золотой медали в этом теге). Вы можете отредактировать мой вопрос, если хотите.