迭代列表A中的组并乘以列表B中的项目

时间:2018-05-26 17:32:38

标签: python

我想将pages/about中前9项中的每一项乘以listA中的第一项,然后将ListB中的下一组9项添加ListA中的第二项。 1}},依此类推listB。到目前为止,我有以下但它不起作用 - ListA只包含一组9项(它应该是12组9项)。

newlist

6 个答案:

答案 0 :(得分:2)

选项1:使用嵌套for循环列表理解

此解决方案在列表推导中使用嵌套的for循环。 itertools.islice允许我们在不形成中间列表的情况下构建结果。

from itertools import islice

A = list(range(1, 28))
B = list(range(1, 4))

res = [i*B[k] for k in range(int(len(A)/9)) for i in islice(A, k*9, (k+1)*9)]

print(res)

[1, 2, 3, 4, 5, 6, 7, 8, 9,
 20, 22, 24, 26, 28, 30, 32, 34, 36,
 57, 60, 63, 66, 69, 72, 75, 78, 81]

选项2:使用zip + itertools.repeat列表理解

itertools.repeat重复元素 n 次。与zipitertools.chain一起,您可以将其操作为所需的可迭代。

from itertools import chain, repeat

B_repeated = chain.from_iterable(zip(*repeat(B, 9)))
res = [i*j for i, j in zip(A, B_repeated)]

选项3:numpy.repeat

如果您可以使用第三方库,numpy提供了一个简单的解决方案:

import numpy as np

res = A * np.repeat(B, 9)

array([ 1,  2,  3,  4,  5,  6,  7,  8,  9,
       20, 22, 24, 26, 28, 30, 32, 34, 36,
       57, 60, 63, 66, 69, 72, 75, 78, 81])

答案 1 :(得分:2)

您可以将ListA扩展为9,而不是砍掉ListB。如果您使用生成器表达式来执行此操作,则甚至不需要额外的存储空间。可以使用此答案中的双重理解来完成扩展:https://stackoverflow.com/a/38758795/2988730

genB = (x for x in ListB for _ in range(9))
newlist = [n * x for n, x in zip(ListA, genB)]

如果您愿意,可以将其组合成单行。这个解决方案很好,因为它既不需要导入也不需要索引,只需要基本的迭代。这样可以更轻松地扩展功能。因此,例如,如果您有一个可以告诉您组大小的迭代,而不是总是有9:

genB = (x for x, count in zip(ListB, counts) for _ in range(count))

答案 2 :(得分:1)

您可以将单个列表分组,然后使用zip

a = list(range(81)) #example data
b = range(1, 10) #example data
new_a = [a[i:i+9] for i in range(0, len(a), 9)]
final_results = [[c*j for c in i] for i, j in zip(new_a, b)]

输出:

[[0, 1, 2, 3, 4, 5, 6, 7, 8], [18, 20, 22, 24, 26, 28, 30, 32, 34], [54, 57, 60, 63, 66, 69, 72, 75, 78], [108, 112, 116, 120, 124, 128, 132, 136, 140], [180, 185, 190, 195, 200, 205, 210, 215, 220], [270, 276, 282, 288, 294, 300, 306, 312, 318], [378, 385, 392, 399, 406, 413, 420, 427, 434], [504, 512, 520, 528, 536, 544, 552, 560, 568], [648, 657, 666, 675, 684, 693, 702, 711, 720]]

答案 3 :(得分:0)

  

一般建议:尝试使用python的内置功能,如lambda,zip,   地图,过滤器等尽可能频繁。

data_smooth <- data_long %>%
  group_by(level) %>%
  do(Nb_obst = .$Nb_obst,
     inf_smooth = predict(loess(.$inf ~ .$Nb_obst, span = 0.35), .$Nb_obst), 
     sup_smooth = predict(loess(.$sup ~ .$Nb_obst, span = 0.35), .$Nb_obst)) %>%
  unnest() 

head(data_smooth)
#> # A tibble: 6 x 4
#>   level Nb_obst inf_smooth sup_smooth
#>   <fct>   <dbl>      <dbl>      <dbl>
#> 1 90         35      0           11. 
#> 2 90         39      0           13.4
#> 3 90         48      0.526       16.7
#> 4 90         39      0           13.4
#> 5 90         41      0           13  
#> 6 90         41      0           13

ggplot(data_smooth, aes(x = Nb_obst, ymin = inf_smooth, ymax = sup_smooth, fill = level)) +
  geom_ribbon(alpha = 0.6) +
  scale_fill_manual(values = c("20" = "darkred", "40" = "red", 
      "60" = "darkorange", "90" = "yellow")) +
  theme_light()

答案 4 :(得分:0)

如果我理解正确,您希望将列表A中的每个值乘以列表B中的值。例如,如果数字1在列表B中,您希望将其乘以列表A中的每个值,例如(1 * 1,1 * 2,1 * 3 ....)等。然后你想将它附加到名为&#34; new_list&#34;的列表中。这是一个可以做到这一点的例子:

list_a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
list_b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
new_list = []

for num in list_b:
    for number in list_a:
        new_num = number * num
        new_list.append(new_num)

print(new_list)

这里我们从一个for循环开始,循环遍历列表B中的所有12个数字。然后它将遍历列表A的所有9个数字,并将每个数字乘以B * A.如您所述,您应该得到108个结果而不是你得到的输出(9 * 12)。我们将输出附加到新列表。

这是你的输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 4, 8, 12, 16, 20, 24, 28, 32, 36, 5, 10, 15, 20, 25, 30, 35, 40, 45, 6, 12, 18, 24, 30, 36, 42, 48, 54, 7, 14, 21, 28, 35, 42, 49, 56, 63, 8, 16, 24, 32, 40, 48, 56, 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81, 10, 20, 30, 40, 50, 60, 70, 80, 90, 11, 22, 33, 44, 55, 66, 77, 88, 99, 12, 24, 36, 48, 60, 72, 84, 96, 108]

答案 5 :(得分:0)

另一种方法:使listBlistA一起使用双列表理解。

listA = list(range(9 * 12))
listB = list(range(9))

res = [a * b for a, b in zip(listA, [b_ for b in listB for b_ in [b] * 12])]

获得群组:

In [872]: list(zip(*(res[i::9] for i in range(9))))
Out[872]: 
[(0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 12, 13, 14, 15, 16, 17),
 (18, 19, 20, 21, 22, 23, 48, 50, 52),
 (54, 56, 58, 60, 62, 64, 66, 68, 70),
 (108, 111, 114, 117, 120, 123, 126, 129, 132),
 (135, 138, 141, 192, 196, 200, 204, 208, 212),
 (216, 220, 224, 228, 232, 236, 300, 305, 310),
 (315, 320, 325, 330, 335, 340, 345, 350, 355),
 (432, 438, 444, 450, 456, 462, 468, 474, 480),
 (486, 492, 498, 588, 595, 602, 609, 616, 623),
 (630, 637, 644, 651, 658, 665, 768, 776, 784),
 (792, 800, 808, 816, 824, 832, 840, 848, 856)]