如何将列表中的项目附加到另一个以特定值停止的项目?

时间:2015-11-25 02:13:26

标签: python

我正在构建一个奥赛罗游戏,所以我在棋盘上有一个bw坐标列表。

例如,我有列表中的坐标列表

list_a = [ [[1,2],[1,3],[1,4],[1,5],[1,6]], [[2,3],[3,4],[4,5]], [[3,5],[2,5],[1,5]] ]

列表1是[[1,2],[1,3],[1,4],[1,5],[1,6]] ### [1,4] is 'b' everything else is 'w'

列表2是[[2,3],[3,4],[4,5]] ### everything is 'w', no 'b'

第三个列表是[[3,5],[2,5],[1,5]] ### [1,5] is 'b'

list_b = []

我想将w的所有坐标添加到list_b停留在b,但如果不w,我不想附加任何b之后有一个list_b

理想情况下,我希望[ [[1,2],[1,3]], [[3,5],[2,5]] ] 成为

[ [[1,2],[1,3],[1,4]], [[3,5],[2,5],[1,5] ]

我不介意是否

b

我可以稍后删除for坐标。

最好的方法是什么?我目前正在课堂上使用while True循环,ifHttpConfiguration.Formatters.语句等构建此内容。

1 个答案:

答案 0 :(得分:0)

你从未说过董事会是什么或者坐标是如何连接的(对[1, 4]来说可能类似于board[1][4] == 'b'?),所以我只会使用你所指的字符串值,例如'wwbww'代替[[1,2],[1,3],[1,4],[1,5],[1,6]]

import itertools
list_a = ['wwbww', 'www', 'wwb']
result = [list(itertools.takewhile(lambda x: x!='b', item)) for item in list_a if 'b' in item]

结果:

>>> result
[['w', 'w'], ['w', 'w']]

resultlist理解,其中每个项目首先检查它是否包含'b'(因为如果有'w',您只需要'b' s在某处),然后在list电话中创建itertools.takewhile()。此函数从迭代中抓取每个元素,直到给定函数返回falsey值。要扩展:

import itertools

def okay_to_add(x):
    return x != 'b'

result = []
for item in list_a:
    if 'b' in item:
        temp = []
        for c in itertools.takewhile(okay_to_add, item):
            temp.append(c)
        result.append(temp)

结果完全相同。

您必须创建自己的okay_to_add函数,而不是简单的x != 'b',查找电路板中的给定坐标并返回它是'b'(或者'w',对于另一个玩家),你感兴趣的。