生成一个循环以达到特定的结果

2024-09-27 19:33:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一种大脑迷雾试图解决以下结构,也许有人可以帮助解决这个问题。你知道吗

 10 11 12 00   11 12 13 01  12 13 14 02  13 14 15 03   14 15 16 04   15 16 17 05

 10 11 12 20   11 12 13 21  12 13 14 22  13 14 15 23   14 15 16 24   15 16 17 25

 10 11 12 02   11 12 13 03  12 13 14 04  13 14 15 05   14 15 16 06   15 16 17 07

 10 11 12 22   11 12 13 23  12 13 14 24  13 14 15 25   14 15 16 26   15 16 17 27

生成此表的算法/循环集是什么样子的?外表的顺序并不重要。四对一捆的东西都应该弹出来。对实际上需要是单个数字,即a 10是a 1和a 0,而不是a ten!你知道吗

编辑:数字中肯定有规律。但是我没有创建一个合适的循环来“捕捉”模式。你知道吗

第一行中的一个模式是(如果只有这一点可以解决的话,这将有帮助):

 x = 1
 i = 0
 xi  x(i+1) x(i+2) (x-1)i     x(i+1)  x(i+2) x(i+3) (x-1)(i+1) ... 

Tags: 算法编辑顺序模式数字结构大脑样子
2条回答

我为这个问题想出了一个有效的算法:)

for row in range(4):
    extra = 0
    if row >= 2:
        extra = 2
    for column in range(6):
        print(10+column, 11+column, 12+column, str(2*(row%2))+"."+str(column + extra), end = "  ")
    print()

把它想象成一个表,你需要一行一行地工作,然后一列一列地工作。我使用算法中的列和行来确定数字应该是什么

如果您有什么不明白的地方,请添加评论:)

此代码生成所需的数据作为字符串的三维列表。你知道吗

a = (0, 0), (2, 0), (0, 2), (2, 2)
b = 10, 11, 12
result = [
    [
        [str(i + j) for j in b] + [str(u) + str(v+i)] for i in range(6)
    ] for u, v in a
]

# Display the resulting list in a relatively compact way    
for row in result:
    print([' '.join(u) for u in row])

输出

['10 11 12 00', '11 12 13 01', '12 13 14 02', '13 14 15 03', '14 15 16 04', '15 16 17 05']
['10 11 12 20', '11 12 13 21', '12 13 14 22', '13 14 15 23', '14 15 16 24', '15 16 17 25']
['10 11 12 02', '11 12 13 03', '12 13 14 04', '13 14 15 05', '14 15 16 06', '15 16 17 07']
['10 11 12 22', '11 12 13 23', '12 13 14 24', '13 14 15 25', '14 15 16 26', '15 16 17 27']

如果这些对实际上应该是整数对,我们需要一个稍微不同的策略:

from pprint import pprint

a = (0, 0), (2, 0), (0, 2), (2, 2)
b = 10, 11, 12
result = [
    [
        [divmod(i + j, 10) for j in b] + [(u, v+i)] for i in range(6)
    ] for u, v in a
]

pprint(result)

输出

[[[(1, 0), (1, 1), (1, 2), (0, 0)],
  [(1, 1), (1, 2), (1, 3), (0, 1)],
  [(1, 2), (1, 3), (1, 4), (0, 2)],
  [(1, 3), (1, 4), (1, 5), (0, 3)],
  [(1, 4), (1, 5), (1, 6), (0, 4)],
  [(1, 5), (1, 6), (1, 7), (0, 5)]],
 [[(1, 0), (1, 1), (1, 2), (2, 0)],
  [(1, 1), (1, 2), (1, 3), (2, 1)],
  [(1, 2), (1, 3), (1, 4), (2, 2)],
  [(1, 3), (1, 4), (1, 5), (2, 3)],
  [(1, 4), (1, 5), (1, 6), (2, 4)],
  [(1, 5), (1, 6), (1, 7), (2, 5)]],
 [[(1, 0), (1, 1), (1, 2), (0, 2)],
  [(1, 1), (1, 2), (1, 3), (0, 3)],
  [(1, 2), (1, 3), (1, 4), (0, 4)],
  [(1, 3), (1, 4), (1, 5), (0, 5)],
  [(1, 4), (1, 5), (1, 6), (0, 6)],
  [(1, 5), (1, 6), (1, 7), (0, 7)]],
 [[(1, 0), (1, 1), (1, 2), (2, 2)],
  [(1, 1), (1, 2), (1, 3), (2, 3)],
  [(1, 2), (1, 3), (1, 4), (2, 4)],
  [(1, 3), (1, 4), (1, 5), (2, 5)],
  [(1, 4), (1, 5), (1, 6), (2, 6)],
  [(1, 5), (1, 6), (1, 7), (2, 7)]]]

下面是第二种解决方案的变体,它使用“传统”for循环,而不是嵌套的列表理解。希望它更容易阅读。:)

a = (0, 0), (2, 0), (0, 2), (2, 2)
b = 10, 11, 12
result = []
for u, v in a:
    row = []
    for i in range(6):
        row.append([divmod(i + j, 10) for j in b] + [(u, v+i)])
    result.append(row)

内置的^{}函数对其参数执行除法和模运算,因此当ab是整数时divmod(a, b)等价于a // b, a % b。如果x是两位数的整数,divmod(x,10)返回一个包含这两位数的元组。你知道吗

相关问题 更多 >

    热门问题