我想将pages/about
中前9项中的每一项乘以listA
中的第一项,然后将ListB
中的下一组9项添加ListA
中的第二项。 1}},依此类推listB
。到目前为止,我有以下但它不起作用 - ListA
只包含一组9项(它应该是12组9项)。
newlist
答案 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 次。与zip
和itertools.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)
另一种方法:使listB
与listA
一起使用双列表理解。
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)]