如何将列表分为一定范围的多个列表?

时间:2018-08-31 08:40:55

标签: python python-3.x list

我有一个列表,需要根据原始列表中的项目数量将列表分为4个单独的列表,最大大小为21。

主列表可以包含1到84个项目。

我希望项目从a开始,并在a, b, c, d中最多填充21个

我有以下代码可以毫无问题地拆分项目,但我想知道是否有更短的方法来进行拆分。除了范围,我重复很多代码。

codes = [x for x in range(80)] # range anywhere between 1-84

print(len(codes))

a = []
b = []
c = []
d = []

for i in range(0, 21):
    try:
        a.append(codes[i])
    except IndexError:
        pass

for i in range(21, 42):
    try:
        b.append(codes[i])
    except IndexError:
        pass

for i in range(42, 63):
    try:
        c.append(codes[i])
    except IndexError:
        pass

for i in range(63, 84):
    try:
        d.append(codes[i])
    except IndexError:
        pass

print(len(a), len(b), len(c), len(d))
print(a)
print(b)
print(c)
print(d)

在此之前,我的代码对整个84个项目都适用,因为顺序并不重要。

    a = []
    b = []
    c = []
    d = []

    for a1, b1, c1, d1 in zip(*[iter(codes)]*4):
        a.append(a1)
        b.append(b1)
        c.append(c1)
        d.append(d1)

但是,如果我说4个项目,它将为每个项目增加1个

a = [0]
b = [1]
c = [2]
d = [3]

我想获得的是

a = [0, 1, 2, 3]
b = []
c = []
d = []

6 个答案:

答案 0 :(得分:2)

您可以使用列表理解来做到这一点:

MAX_SIZE = 21

l = list(range(80))

l1,l2,l3,l4 = [l[i*MAX_SIZE: (i+1)*MAX_SIZE] for i in range(4)] 


#l1=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,20],
# .... 
#l4=[63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79]

答案 1 :(得分:2)

您可以简单地使用子列表

a = codes[0: 21]
b = codes[21:42]
c = codes[42:63]
d = codes[63:84]

这可以满足您的要求

答案 2 :(得分:1)

您可以使用itertools中的zip_longest函数

from itertools import zip_longest

master_list = range(0, 84)

iterables = [iter(master_list)] * 21
slices = zip_longest(*iterables, fillvalue=None)

for slice in slices:
    print("slice", slice)

# slice (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
# slice (21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41)
# slice (42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62)
# slice (63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83)

答案 3 :(得分:1)

@SajalPreetSinghs答案对于像您这样的简单用例是正确的!

但是在可扩展性方面,它也有一些缺点。例如:

  • 当您需要20个子列表而不是实际的4个子列表时,您将不得不再添加16行,并为每行指定2个不同的数字!
  • 现在假设您已经将代码扩展到20个子列表,但是现在您希望每个子列表的最大项目数是37个而不是21个-您必须更改2 * 20 = 40个数字!

因此,如果您想要具有更好的可伸缩性的东西,可以使用以下代码,这些代码利用了发电机

import random

# CODE #
def sublist(master, list_of_subs, max_items_per_list):
    def sublist_generator():
        for sublist in list_of_subs:
            yield sublist

    sublist = sublist_generator()
    current = next(sublist)
    for code in codes:
        current.append(code)

        if len(current) == max_items_per_list: # current list is full
            current = next(sublist) # so let current point to the next list

# SETUP AND USAGE #
start = 1
stop = random.randint(2, 85) # generate random int inclusively 2 and 85
codes = [x for x in range(start, stop)] # stop is exclusive: range(1, 85) == [1, 2, ..., 84]

a, b, c, d = [], [], [], []
sublists = [a, b, c, d] # *1

sublist(codes, sublists, 21)
for sublist in sublists:
    print(sublist)

更好的可伸缩性:

  • 如果要更改每个子列表的项目数,只需传递新的最大数量即可。

  • 如果要增加子列表的数量,只需要将更多子列表添加到传递给函数的sublists变量中即可(请参见*1)。

  • 如果您经常需要此代码,这没问题,因为您可以方便地调用该函数。

我希望这对某人有帮助!

干杯
温克勒尔

答案 4 :(得分:1)

使用列表推导式的解决方案:


i_list = range(0,84)
r = 21
res = [i_list[i:i+r] for i in range(0,len(i_list),r)]

答案 5 :(得分:0)

我会做的只是将它放在一个循环中。

如果索引是0到83

for i in range(0,84):

   if i>=0 and i<=20:
      a.append(codes[i])
   elif i>20 and i<=41:
      b.append(codes[i])
   elif i>41 and i<=62:
      c.append(codes[i])
   elif i>62 and i<=83:
      d.append(codes[i])