如何更改多个索引的值?

时间:2016-06-12 23:00:57

标签: python arrays

worldArray = [["." for i in range(5)] for i in range(5)]

这会产生一张我可以用于游戏的地图。它应该看起来像:

[['.', '.', '.', '.', '.'],
 ['.', '.', '.', '.', '.'],
 ['.', '.', '.', '.', '.'],
 ['.', '.', '.', '.', '.'],
 ['.', '.', '.', '.', '.']]

假设'.'代表草瓦。如果我想将特定数量的索引替换为'~'而不是代表水瓦片,那么最简单的方法是什么?我希望地图看起来有点像:

[['.', '.', '.', '.', '.'],
 ['.', '.', '.', '.', '.'],
 ['.', '.', '.', '.', '.'],
 ['~', '~', '.', '.', '.'],
 ['~', '~', '~', '.', '.']]

我知道我可以手动浏览并更改每个特定索引以显示'~'磁贴,但我使用的真实游戏内地图是40 x 40而不是 - 这样就可以单独替换每个索引有点乏味和多余。我希望能够定义我想要替换的哪些瓷砖,即第4行,第1-2列;第5行,第1列 - 第3列。我怎么能这样做?

4 个答案:

答案 0 :(得分:3)

切片符号是完美的:

from functools import partial

def tile(icon, row, col_start, col_end):
    worldArray[row][col_start:col_end] = icon * (col_end - col_start)

water = partial(tile, '~')
mountain = partial(tile, '^')

water(3, 0, 2)
water(4, 0, 3)

答案 1 :(得分:1)

你可以写一个辅助函数

def replace_at_position(world_array, row_col_dict, repl_char):
    """
    Use row_col_dict in format of {row : (startOfRange, endOfRange)} to replace the characters
    inside the specific range at the specific row with repl_char
    """

    for row in row_col_dict.keys():
        startPos, endPos = row_col_dict[row]

        for i in range(startPos, endPos):
            worldArray[row][i] = repl_char
    return worldArray

你可以像这样使用它:

worldArray = [["." for i in range(10)] for j in range(5)]

# replace row 2 (the third row) colums 0-4 (inclusive, exclusive, like range) with character '~'
worldArray = replace_at_position(worldArray, {2 : (0,10)}, '~')

#replace row 1 (the second row) colums 0-5 (inc, exc, like range) with character '~'
worldArray = replace_at_position(worldArray, {1 : (0, 5)}, '~')

pprint.pprint(worldArray)

这将导致:

[['.', '.', '.', '.', '.', '.', '.', '.', '.', '.'],
 ['~', '~', '~', '~', '~', '.', '.', '.', '.', '.'],
 ['~', '~', '~', '~', '~', '~', '~', '~', '~', '~'],
 ['.', '.', '.', '.', '.', '.', '.', '.', '.', '.'],
 ['.', '.', '.', '.', '.', '.', '.', '.', '.', '.']]

答案 2 :(得分:0)

我会定义一个函数,该函数返回是否使~而不是.

"""
Determines if the game position is regular or not
"""
def isRegular(x,y):
    # Only replace Row 4 column 1 and 2 with ~
    return not (x==4 and y in [1,2])

worldArray = [["." if isRegular(x,y) else "~" for x in range(5) ] for y in range(5)]

您可以根据自己的喜好更改regular()功能。

答案 3 :(得分:0)

根据您的问题,我将一个简单的功能组合在一起。随意将其复制并粘贴到IDLE控制台中:

>>> def a():
global worldArray
b = 1
while b < 2:
    c = (int(input('Row #: ')),int(input('Column-Leftbound: ')),int(input('Column-Rightbound: ')))
    worldArray[c[0]][c[1]] = '~'
    worldArray[c[0]][c[2]] = '~'
    d = c[2] - c[1]
    for i in range(d):
        worldArray[c[0]][c[1]+i] = '~'
    print(worldArray)
    b = int(input('b now equals: '))
>>> a() #This line is for you to call the function at the console

牢记这些事情:

合法的行号和列号来自:0-4。

另外,为了退出while循环,我要求你重置b的值。如果输入的值小于2,则保持循环。如果有帮助,请告诉我。我试着保持简单。

作为旁注,

worldArray = [[&#34;。&#34; for i in range(5)] for i in range(5)]

对我来说不会产生漂亮而整洁的矩阵。