使用变量元组访问列表元素

时间:2014-10-16 12:19:34

标签: python list tuples indices

免责声明:初学者,自学Python用户。

ndarrays的一个非常酷的功能是它们能够接受整数元组作为索引(例如myNDArray[(1,2)] == myNDArray[1][2])。这允许我将索引未指定为变量(例如indicesTuple),直到脚本确定要使用的ndarray的哪个部分,在这种情况下,变量被指定为整数元组并用于访问ndarray的一部分(例如myNDArray[indicesTuple])。使用变量的效用是元组的LENGTH可以根据ndarray的尺寸而变化。

然而,这限制了我使用数值数组。我尝试使用列表,但它们不能将索引作为索引(例如myList[(1,2)]给出错误。)。有没有办法为列表索引“解包”元组,因为可以用于函数参数?或者更简单或更有效的东西?

更新:神圣的,我忘记了存在。基本上我最终了解到你可以使用参数dtype = object初始化ndarray,它允许ndarray包含多种类型的Python对象,就像列表一样。至于访问列表,正如评论者指出的那样,我可以使用for循环迭代变量indicesTuple来访问列表中越来越嵌套的元素。对于就地编辑,请参阅接受的评论,真的在那里加倍努力。

4 个答案:

答案 0 :(得分:0)

假设您有一个(i,j)索引列表

indexList = [(1,1), (0,1), (1,2)]

您要从

索引的某些2D列表
l = [[1,2,3],
     [4,5,6],
     [7,8,9]]

您可以使用列表推导来获取这些元素,如下所示

>>> [l[i][j] for i,j in indexList]
[5, 2, 6]

然后你的索引可以是你想要的任何东西。它们将在列表推导中解压缩,并用作列表索引。对于您的具体应用,我们必须查看您的索引变量的来源,但这是一般的想法。

答案 1 :(得分:0)

Python没有多维列表,所以myList[(1,2)]只能被认为是(myList[1], myList[2])的快捷方式(有时会很方便,尽管你可以使用import operator; x = operator.itemgetter(1,2)(myList)来完成同样的事情。)

如果您的myList看起来像

myList = [ ["foo", "bar", "baz"], ["a", "b", c" ] ]

然后myList[(1,2)]无法工作(或有意义),因为myList不是二维列表:它是包含对列表的引用的列表。您使用myList[1][2],因为第一个索引myList[1]会返回对["a", "b", "c"]的引用,您应用第二个索引[2]来获取"c"

稍微相关,你可以使用字典来精确地模拟稀疏数组,方法是使用元组作为默认字典的键。

import collections
d = collections.defaultdict(str)
d[(1,2)] = "foo"
d[(4,5)] = "bar"

您尝试用作键的任何其他元组都将返回空字符串。它不是一个完美的模拟,因为您无法使用类似

之类的内容访问数组的完整行或列
row1 = [d[1, x] for x in range(C)] # where C is the number of columns
col3 = [d[x, 3] for x in range(R)] # where R is the number of columns

答案 2 :(得分:0)

使用由元组

索引的词典
>>> width, height = 7, 6
>>> grid = dict(
        ((x,y),"x={} y={}".format(x,y))
        for x in range(width)
        for y in range(height))
>>> print grid[3,1]
x=3 y=1

使用列表列表

>>> width, height = 7, 6
>>> grid = [
        ["x={} y={}".format(x,y) for x in range(width)]
        for y in range(width)]
>>> print grid[1][3]
x=3 y=1

在这种情况下,你可以制作一个getter和setter函数:

def get_grid(grid, index):
    x, y = index
    return grid[y][x]

def set_grid(grid, index, value):
    x, y = index
    grid[y][x] = value

您可以更进一步,创建自己的类,其中包含列表列表,并定义一个索引器,它将元组作为索引并执行相同的过程。它可以做一些更明智的边界检查,并提供比字典更好的诊断,但它需要一些设置。我认为字典方法可以快速探索。

答案 3 :(得分:0)

我将您的问题解释为:

  

我有一个N维列表,以及一个包含N个值(T1,T2 ... TN)的元组。如何使用元组值访问列表?我不知道N会提前发生什么。

我不知道有这样做的内置方法,但你可以编写一个迭代挖掘列表的方法,直到达到最里面的值。

def get(seq, indices):
    for index in indices:
        seq = seq[index]
    return seq

seq = [
    [
        ["a","b"],
        ["c","d"]
    ],
    [
        ["e","f"],
        ["g","h"]
    ]
]

indices = [0,1,0]
print get(seq, indices)

结果:

c

您也可以使用reduce在*行中执行此操作,但读者不会非常清楚您要完成的操作。

print reduce(lambda s, idx: s[idx], indices, seq)

(*如果您使用3.X,则需要从reduce导入functools。所以,两行。)


如果要在N维列表中设置值,请使用get访问列表的第二深级别,然后分配给该列表。

def set(seq, indices, value):
    innermost_list = get(seq, indices[:-1])
    innermost_list[indices[-1]] = value