生成数字T * U的列表,并在T的每个分支中从索引0开始互相过滤

时间:2019-06-04 13:18:52

标签: python arrays list

我想生成数字数组,并且只获取绿色的数字。我该如何进行? img

这是从蚱rh犀牛的阵列中过滤特定点。这就是我尝试过的。

t = 4
u = 11
b = []

for i in range(t*u):
    if i % 2 == 0:
        b.append(i)
print(b)

我想弄清楚数字(图片中的高绿色)

[0, 2, 4, 6, 8, 10, 11, 13, 15, 17, 19, 21, 22, 24, 26, 28, 30, 32, 33, 35, 37, 39, 41, 43]

不是这个

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42]

5 个答案:

答案 0 :(得分:1)

如果您希望使用迭代来执行此操作,则逐列解决该问题更有意义。

t = 4
u = 11
result = []
for col in range(t):
    result.extend(range(col*u, (col+1)*u, 2)) #run through 11 numbers starting from the offset of col*u (0*11, 1*11, 2*11 and so on) with an step size of 2.
print(result)
#Output:
[0, 2, 4, 6, 8, 10, 11, 13, 15, 17, 19, 21, 22, 24, 26, 28, 30, 32, 33, 35, 37, 39, 41, 43]

答案 1 :(得分:0)

[[i + 11*n for n in range(4)] for i in range(0, 11, 2)]

将返回:

[[0, 11, 22, 33],
 [2, 13, 24, 35],
 [4, 15, 26, 37],
 [6, 17, 28, 39],
 [8, 19, 30, 41],
 [10, 21, 32, 43]]

如果要在一个简单列表中使用,请使用itertools.chain

list(itertools.chain.from_iterable(
    zip(*[
        [i + 11*n for n in range(4)]
        for i in range(0, 11, 2)
    ])
))

将返回:

[0, 2, 4, 6, 8, 10, 11, 13, 15, 17, 19, 21, 22, 24, 26, 28, 30, 32, 33, 35, 37, 39, 41, 43]

答案 2 :(得分:0)

itertools.chain来营救!

您有4个连续的序列,从11 * i到11 *(i + 1)步进2:

result = list(itertools.chain(*(range(11*i, 11*(i+1), 2) for i in range(4))))

它给出:

[0, 2, 4, 6, 8, 10, 11, 13, 15, 17, 19, 21, 22, 24, 26, 28, 30, 32, 33, 35, 37, 39, 41, 43]

答案 3 :(得分:0)

您可以使用:

t = 4
u = 11
b = [x for x in range(t*u) if (x%u)%2 == 0]

print(b)

输出:

  

[0, 2, 4, 6, 8, 10, 11, 13, 15, 17, 19, 21, 22, 24, 26, 28, 30, 32, 33, 35, 37, 39, 41, 43]


EXPLANATION:
您需要一个从0u的范围。
此范围将重复t次。

如果您考虑使用t == 1,则需要使用备用数字。由于您始终从0开始,因此这意味着所有偶数(因此n%2 == 0)。

如果您有第二个循环(t == 2),则范围为0+uu+u。由于我们想将此范围设为已知条件(range(0,u)),因此我们可以应用n%2 == 0,我们在迭代中将每个整数除以u,因此其余整数对应于该值在range(0,u)的同一步骤中。


示例:

  • 我们可以取整个范围(t*u)中的所有数字:

    full_range = [x for x in range(t*u)] # output: [0, 1, 2, 3, 4, 5,...43]

  • 将所有这些数字减少到基本范围(range(0,u):

    basic_range = [y%u for y in full_range]

输出:

  

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

  • 检查偶数:
    even_numbers = [z%2 == 0 for z in basic_range]

输出:

  

[True, False, True, False, True, False, True, False, True, False, True, True, False, True, False, True, False, True, False, True, False, True, True, False, True, False, True, False, True, False, True, False, True, True, False, True, False, True, False, True, False, True, False, True]


您会看到带有True的索引就是您要选择的数字;因此,如果您将这些条件应用于全部范围(range(0,t*u)),并且仅选择满足条件的整数,则将获得数字列表。


在评论中,您表示有必要也每11个数字都跳过一次。
按照前面的说明,我们可以添加条件(x%u) != 10

[x for x in range(t*u) if (x%u)%2 == 0 and (x%u) != 10]

输出:

  

[0, 2, 4, 6, 8, 11, 13, 15, 17, 19, 22, 24, 26, 28, 30, 33, 35, 37, 39, 41]

答案 4 :(得分:0)

该级数也可以表示为f(n)= 2n-n // 6

r = [2*i - i//6 for i in range(24)]

# [0, 2, 4, 6, 8, 10, 11, 13, 15, 17, 19, 21, 22, 24, 26, 28, 30, 32, 33, 35, 37, 39, 41, 43]