好的,所以我试图以pythonic的方式解决这个逻辑问题,但我不是很好。这是:
你有一张纸上面有一个数字列表,如下:
1 2 3 4 | 5 6 7 8
如果您将纸张从左侧向右折叠到中间,则会收到此订单:
(第一个数字在顶部) (4,5)(3,6)(2,7)(1,8)
你可以再次折叠它,并获得一个新订单(从右到左的例子):
(第一个数字在顶部,然后第二个在下面,......等) (8,1,4,5)(7,2,3,6)
我开始看到如何折叠纸张并获得具有正确顺序的列表列表:
paper = [1, 2, 3, 4, 5, 6, 7, 8]
half_paper = len(paper)/2
s = paper[:half_paper]
e = paper[half_paper:]
middle_distance = 0
final_list = []
for l in range(half_paper):
print l
m = [s[half_paper-middle_distance-1],e[middle_distance-half_paper]]
final_list.append(m)
middle_distance += 1
print final_list
这有效,结果为[[4,5],[3,6],[2,7],[1,8]](从左到右折叠)。但是现在我被卡住了。我一直试图找出一种方法来使用列表理解来在final_list结果上应用逻辑,所以我可以再次“折叠”纸张以获得[[5,4,1,8],[6]的结果,3,2,7]](从左到右折叠,或者从右到左折叠[[8,1,4,5],[7,2,3,6]])。
我不确定如何使用列表推导来完成我在for循环中所做的事情,在列表列表上生成列表列表。让我开始的任何想法?
答案 0 :(得分:3)
l = [1, 2, 3, 4, 5, 6, 7, 8]
l1,l2 = l[:len(l)/2], l[len(l)/2:]
l = [ [x,y] for x,y in zip (l1, l2[::-1])]
for i in range(len(l)):
if isinstance(l[i][0], list):
l[i] = [x for item in l[i] for x in item]
print l
l1,l2 = l[:len(l)/2], l[len(l)/2:]
l = [ [x,y] for x,y in zip (l1, l2[::-1])]
for i in range(len(l)):
if isinstance(l[i][0], list):
l[i] = [x for item in l[i] for x in item]
print l
<强>输出强>
[[1, 8], [2, 7], [3, 6], [4, 5]]
[[1, 8, 4, 5], [2, 7, 3, 6]]