如果不是元组,则无法访问List元素

时间:2014-04-02 21:55:04

标签: list python-2.7 tuples element

由于某些不明原因,我可以访问元组的元素,但如果它是列表,我就不能这样做。

def __init__(self, collider, x, y, gridKeys, tilesetGids, collisionGids):

    self.gridKeys = gridKeys
    self.gids = tilesetGids
    for i in self.gridKeys:
        if ((i[0][0] == x) and (i[0][1] == y)):
            print i

参数gridKeys是一个包含两个元素的元组列表(第一个是另一个元组,第二个是字符串)。这是gridKeys:

[((0, 0), '1'), ((0, 1), '1'), ((0, 2), '1'), ((0, 3), '1'), ((0, 4), '1'), ((0, 5), '1'), ((0, 6), '1'), ((0, 7), '1'), ((0, 8), '1'), ((0, 9), '1'), ((1, 0), '1'), ((1, 1), '0'), ((1, 2), '0'), ((1, 3), '0'), ((1, 4), '1'), ((1, 5), '1'), ((1, 6), '0'), ((1, 7), '0'), ((1, 8), '0'), ((1, 9), '1'), ((2, 0), '1'), ((2, 1), '0'), ((2, 2), '0'), ((2, 3), '0'), ((2, 4), '0'), ((2, 5), '0'), ((2, 6), '0'), ((2, 7), '0'), ((2, 8), '0'), ((2, 9), '1'), ((3, 0), '1'), ((3, 1), '0'), ((3, 2), '0'), ((3, 3), '0'), ((3, 4), '0'), ((3, 5), '0'), ((3, 6), '0'), ((3, 7), '0'), ((3, 8), '0'), ((3, 9), '1'), ((4, 0), '1'), ((4, 1), '0'), ((4, 2), '0'), ((4, 3), '0'), ((4, 4), '0'), ((4, 5), '0'), ((4, 6), '0'), ((4, 7), '0'), ((4, 8), '0'), ((4, 9), '1'), ((5, 0), '1'), ((5, 1), '3'), ((5, 2), '0'), ((5, 3), '0'), ((5, 4), '0'), ((5, 5), '0'), ((5, 6), '0'), ((5, 7), '0'), ((5, 8), '0'), ((5, 9), '1'), ((6, 0), '1'), ((6, 1), '1'), ((6, 2), '1'), ((6, 3), '1'), ((6, 4), '0'), ((6, 5), '0'), ((6, 6), '0'), ((6, 7), '0'), ((6, 8), '4'), ((6, 9), '1'), ((7, 0), '1'), ((7, 1), '0'), ((7, 2), '0'), ((7, 3), '0'), ((7, 4), '0'), ((7, 5), '0'), ((7, 6), '0'), ((7, 7), '1'), ((7, 8), '1'), ((7, 9), '1'), ((8, 0), '1'), ((8, 1), '0'), ((8, 2), '0'), ((8, 3), '0'), ((8, 4), '0'), ((8, 5), '0'), ((8, 6), '0'), ((8, 7), '1'), ((8, 8), '1'), ((8, 9), '1'), ((9, 0), '1'), ((9, 1), '1'), ((9, 2), '1'), ((9, 3), '1'), ((9, 4), '1'), ((9, 5), '1'), ((9, 6), '1'), ((9, 7), '1'), ((9, 8), '1'), ((9, 9), '1')]

正如你在迭代中看到的那样,我测试每个外部元组中每个内部元组的第一个和第二个元素是否等于x和y参数。如果是真的,它会打印整个外部元组:

((2, 3), '0') # I've passed a 2 for the x argument and a 3 for the y argument.

现在,由于一些不明原因,如果我将每个外部元组转换为一个列表,我就无法访问这些元素:

def __init__(self, collider, x, y, gridKeys, tilesetGids, collisionGids):

    self.gridKeys = [list(x) for x in gridKeys] # Converting each tuple to a mutable sequence.
    self.gids = tilesetGids
    for i in self.gridKeys:
        if ((i[0][0] == x) and (i[0][1] == y)):
            print i

这没有输出。由于某些原因,结果不正确,但是,如果我打印转换后的gridKeys:

[[(0, 0), '1'], [(0, 1), '1'], [(0, 2), '1'], [(0, 3), '1'], [(0, 4), '1'], [(0, 5), '1'], [(0, 6), '1'], [(0, 7), '1'], [(0, 8), '1'], [(0, 9), '1'], [(1, 0), '1'], [(1, 1), '0'], [(1, 2), '0'], [(1, 3), '0'], [(1, 4), '1'], [(1, 5), '1'], [(1, 6), '0'], [(1, 7), '0'], [(1, 8), '0'], [(1, 9), '1'], [(2, 0), '1'], [(2, 1), '0'], [(2, 2), '0'], [(2, 3), '0'], [(2, 4), '0'], [(2, 5), '0'], [(2, 6), '0'], [(2, 7), '0'], [(2, 8), '0'], [(2, 9), '1'], [(3, 0), '1'], [(3, 1), '0'], [(3, 2), '0'], [(3, 3), '0'], [(3, 4), '0'], [(3, 5), '0'], [(3, 6), '0'], [(3, 7), '0'], [(3, 8), '0'], [(3, 9), '1'], [(4, 0), '1'], [(4, 1), '0'], [(4, 2), '0'], [(4, 3), '0'], [(4, 4), '0'], [(4, 5), '0'], [(4, 6), '0'], [(4, 7), '0'], [(4, 8), '0'], [(4, 9), '1'], [(5, 0), '1'], [(5, 1), '3'], [(5, 2), '0'], [(5, 3), '0'], [(5, 4), '0'], [(5, 5), '0'], [(5, 6), '0'], [(5, 7), '0'], [(5, 8), '0'], [(5, 9), '1'], [(6, 0), '1'], [(6, 1), '1'], [(6, 2), '1'], [(6, 3), '1'], [(6, 4), '0'], [(6, 5), '0'], [(6, 6), '0'], [(6, 7), '0'], [(6, 8), '4'], [(6, 9), '1'], [(7, 0), '1'], [(7, 1), '0'], [(7, 2), '0'], [(7, 3), '0'], [(7, 4), '0'], [(7, 5), '0'], [(7, 6), '0'], [(7, 7), '1'], [(7, 8), '1'], [(7, 9), '1'], [(8, 0), '1'], [(8, 1), '0'], [(8, 2), '0'], [(8, 3), '0'], [(8, 4), '0'], [(8, 5), '0'], [(8, 6), '0'], [(8, 7), '1'], [(8, 8), '1'], [(8, 9), '1'], [(9, 0), '1'], [(9, 1), '1'], [(9, 2), '1'], [(9, 3), '1'], [(9, 4), '1'], [(9, 5), '1'], [(9, 6), '1'], [(9, 7), '1'], [(9, 8), '1'], [(9, 9), '1']]

唯一的区别是现在每个外部元组都是一个列表,理论上,我应该能够以完全相同的方式访问它们(__ getitem __)。为什么我不能访问列表元素,如果它不是一个元组?

2 个答案:

答案 0 :(得分:3)

在Python 2.7中,输入的x变量被重新定义为gridKeys的最后一个元素。

在Python 3.3中,这不会发生。

简单的解决方案是使用不同的变量名称。

答案 1 :(得分:2)

发现问题:

def __init__(self, collider, x, y, gridKeys, tilesetGids, collisionGids):

    self.gridKeys = [list(PROBLEMHERE) for PROBLEMHERE in gridKeys] # Converting each tuple to a mutable sequence.
    self.gids = tilesetGids
    for i in self.gridKeys:
        if ((i[0][0] == x) and (i[0][1] == y)):
            print i
    self.collisionGids = collisionGids

我在list-comprehension中使用“x”作为参数,这让x参数混淆了(我的分心/错误......但这是一种“让人分心”的模糊方法。)x参数只是一个int数字,但是列表理解中的x是一个包含两个元素的整个元组(并且该元组是正在测试的元组,这就是结果为假的原因)。