2

好的,所以我试图以 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 循环中所做的事情,在列表列表上并生成列表列表。有什么想法可以让我开始吗?

4

1 回答 1

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]]
于 2013-04-02T06:45:20.420 回答