在列表中移动对象

时间:2015-01-07 19:00:43

标签: python

我做了一个这样的清单:

mapxy = [[0 for x in range(16)] for x in range(16)]

我从另一个普通列表添加对象:

for y in range(0, 16):
    for x in range(0, 16):
        mapxy[x][y] = mapList[o]

然后我想将列表中的一个对象向下移动,只需更改第一个在列表中左右移动的索引mapxy[x+1][y]

mapxy.pop(f_pos_x)
mapxy.insert(f_pos_x + 1, ["1"])
f_pos_x += 1

(这并没有像我想要的那样工作,它最终介于/创建了第一个列表中的另一个列表而不是像我想要的那样插入内部列表。)< / em>的

,但也在y上上下移动:mapxy[x][y+1]

我希望它看起来如何: 原始

 mapxy = [[" ", " ", "1"," "][" ", " ", " "," "][" ", " ", " "," "][" ", " ", " "," "]]

当我按下右键时:

mapxy = [[" ", " ", " ","1"][" ", " ", " "," "][" ", " ", " "," "][" ", " ", " "," "]]

当我按下时:

   mapxy = [[" ", " ", " "," "][" ", " ", " ","1"][" ", " ", " "," "][" ", " ", " "," "]]

3 个答案:

答案 0 :(得分:0)

mapxy是一个列表列表(显然所有“单元格”都初始化为单个项目mapList[o],这有点奇怪)。因此popinsert会删除并分别一次添加整个列表,而不是单个项目。

你说你想要“移动”一个项目而不是取代它的位置。如果你只想复制该项目,那显然只是:

map[x+1][y] = map[x][y]

但是如果之前的map[x][y]必须用其他东西填充,那么你当然也必须分配给它。沿y而不是x“移动”完全相同。

答案 1 :(得分:0)

使用以元组为键的字典:

map = {}
for x in range(16):
    for y in range(16):
        map[x, y] = 0

实际上,您可以避免初始化并检查元素是否已设置或使用默认值。关于此默认值,请考虑None。使用此dict,您可以轻松地“移动”元素:

map[1, 2] = 42
v = map.pop((1, 2))
map[3, 4] = v

答案 2 :(得分:0)

这是我认为你想要的完整脚本。但在我粘贴并逃跑之前,有两件事值得一提。你需要就地交换物品。 2.您需要满足超出范围的索引错误。

首先,我设想使用带有deque字段集的maxlen个deques。 deque库中提供了collections。因此,向左移动,您向右弹出并向左插入,向右移动,向左弹出,向右移动。但后来我又有了一个想法。

您坚持使用列表列表,就地交换项目并避免超出范围错误新计算索引在包含该项目的列表的模块长度的非负整数集内。

说够了。在python中就地交换,给出:

x = [8, 21, 100, 9, 5]

你这样做:

x[2], x[3] = x[3], x[2]

导致:

x = [8, 21, 9, 100, 5]

下面的脚本跟踪两个索引,x对应于项目的索引,字符串,左右移动,y对应于包含内容的内部列表项的索引要左右移动的项目(内部列表本身上下移动)。按指数我的意思是位置。因此x指向字符串,y指向列表。

要在包含列表中上下移动,您只需要知道要移动的列表的索引y。要向左和向右移动项目(字符串),您需要知道包含列表索引y和项目索引x


#!/usr/bin/python

from collections import deque

def move_dowm(data, y):
    old_y = y
    y = (y + 1) % len(data)
    data[old_y], data[y] = data[y], data[old_y]
    return y

def move_up(data, y):
    old_y = y
    y = (y - 1) % len(data)
    data[old_y], data[y] = data[y], data[old_y]
    return y

def move_right(data, x, y):
    old_x = x
    x = (x + 1) % len(data[y])
    data[y][old_x], data[y][x] = data[y][x], data[y][old_x]
    return x

def move_left(data, x, y):
    old_x = x
    x = (x - 1) % len(data[y])
    data[y][old_x], data[y][x] = data[y][x], data[y][old_x]
    return x

if __name__ == '__main__':
    dataset = [
        [' ', ' ', ' ', ' '],
        ['1', ' ', ' ', ' '],
        [' ', ' ', ' ', ' '],
        [' ', ' ', ' ', ' '],
    ]
    x, y = 0, 1

    print dataset
    print '-' * 90

    y = move_up(dataset, y)
    print dataset
    print '-' * 90

    y = move_dowm(dataset, y)
    print dataset
    print '-' * 90

    x = move_left(dataset, x, y)
    print dataset
    print '-' * 90

    x = move_right(dataset, x, y)
    print dataset
    print