2016-11-10 50 views
1

我有一种脑雾试图解决以下结构,也许有人可以协助解决这个问题。生成一个循环来达到一定的结果

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 

算法/一组循环看起来会如何产生这个表?外观顺序并不重要。应该弹出所有四对的捆绑包。对实际上需要单个数字,即1010,而不是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) ... 
+4

你可以展示你试过的东西,指出你遇到了哪些问题? – glibdud

+1

是这功课吗? – RickyA

+1

为什么最后2组('16 17 18 26'和'17 18 19 27')而不是('14 15 16 26'和'15 16 17 27')?这张表是什么样的数据结构?它只是一个字符串,还是应该是某种列表? –

回答

1

此代码生成所需的数据串的3D名单。

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循环,而不是嵌套列表理解的“传统”的第2解决方案的变化。希望阅读起来更容易一些。 :)

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) 

内置divmod函数执行其参数除法和模量,所以,当ab是整数divmod(a, b)相当于a // b, a % b。如果x是一个两位整数`divmod(x,10)返回一个包含这两个数字的元组。

+0

这个结果是关于我在找什么。但是,我还没有掌握代码。需要深入研究。 –

+1

@Al_Iskander我将添加第二个使用“传统”循环的解决方案的变体,这可能会更容易理解。 –

+0

完美。很有帮助。非常感谢 –

1

我想出了一个高效的算法,对于这个问题:)

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() 

思考它像一个表格,你想要逐行处理,然后逐列处理。我使用的列和行中的算法来确定的数字应该是什么

添加评论,如果有什么事,你不明白:)

+0

谢谢。结果是朝着正确的方向发展。但@PM 2Ring的答案更直接地解决了数字问题。 –

+0

不是问题:) –

相关问题