功能:在列表中的不同方向上移动项目?

时间:2016-11-01 01:36:02

标签: python list python-3.x

如果可以在列表中移动值,我需要返回布尔值。 ''是字符串可以移动到的空白点。对于第一个函数,我如何左右移动相同的值?我不确定如何定义左右变量,并且想知道我是否需要pop。()来删除我将变量移动到的位置。

area1 = [['.', '.', '.', 'e'], 
         ['A', 'A', '.', 'e'], 
         ['.', 'X', '.', 'e'], 
         ['.', 'X', 'Y', 'Y'], 
         ['.', '.', 'Z', 'Z']]

def shift_horizontal(value, direction, area):
    for i in range(len(area)-1):
        for j in range(len(row)-1):
            if right and value[i] == '.'[i+1]: # Will shift right if value next is '.'
                return True
            elif left and value[i] == '.'[i-1]: # Will shift left if value next is '.'
                return True
            else:
                return False
shift_horizontal('A', right, area1)

列表应如何显示(我实际上不需要返回列表,只是一个直观的参考):

area1 = [['.', '.', '.', 'e'], 
         ['.', 'A', 'A', 'e'], 
         ['.', 'X', '.', 'e'], 
         ['.', 'X', 'Y', 'Y'], 
         ['.', '.', 'Z', 'Z']]

我计划编写第二个函数,它只会在列表中上下移动值。我需要在上面的函数中进行哪些更改才能使其在列表中上下移动变量?任何帮助/建议表示赞赏。我试图保持简单,只有循环和布尔的人很少有内置的功能,听起来很乏味。

2 个答案:

答案 0 :(得分:1)

def shift_horizontal(value, direction, area):#direction True is left
    result = []
    for lane in area:
        if not direction:
            lane = reversed(lane)
        try:
            ind = lane.index(value)
            result.append( '.' in lane[:index])
        except ValueError:
            result.append(False)
    return result

返回布尔值列表。根据方向翻转列表。然后找到最左边的value索引。然后查看截至'.'的列表。不确定这是不是你想要的。如果您想查看是否存在相邻的'.',请执行if lane[index-1] == '.'

答案 1 :(得分:0)

你可以简单地使用-1& +1而不是左和右。
在一次运行中移动所有'A':
如果方向为+1(向右),则从右向左迭代内部列表,尝试在遇到时移动每个“A”,直到该行结束。
如果方向为-1(向左),则从左向右迭代。

area1 = [['.', '.', '.', 'e'], 
         ['A', 'A', '.', 'e'], 
         ['.', 'X', '.', 'e'], 
         ['.', 'X', 'Y', 'Y'], 
         ['.', '.', 'Z', 'Z']]

def move_horizontal(table, value, direction):
    is_anything_moved = False
    for row in table:
        width = len(row)
        # Traverse the row (skipping the first element) from right to left if direction is 1. 
        for x in (range(1,width,1) if direction==-1 else range(width-2,-1,-1)): 
            if row[x]==value: #found a value match, now move it as far as we can
                i = x+direction # new index of value
                while i<width and i>=0 and row[i]=='.':
                    row[i-direction] = '.'
                    row[i] = value
                    i += direction
                    is_anything_moved = True
    return is_anything_moved

[print(row) for row in area1]
print()

move_horizontal(area1,'A',1)

[print(row) for row in area1]
print()

move_horizontal(area1,'e',-1)

[print(row) for row in area1]

这应输出:

['.', '.', '.', 'e']
['A', 'A', '.', 'e']
['.', 'X', '.', 'e']
['.', 'X', 'Y', 'Y']
['.', '.', 'Z', 'Z']

['.', '.', '.', 'e']
['.', 'A', 'A', 'e']
['.', 'X', '.', 'e']
['.', 'X', 'Y', 'Y']
['.', '.', 'Z', 'Z']

['e', '.', '.', '.']
['.', 'A', 'A', 'e']
['.', 'X', 'e', '.']
['.', 'X', 'Y', 'Y']
['.', '.', 'Z', 'Z']