使用变量元组访问lis元素

2024-06-06 20:19:15 发布

您现在位置:Python中文网/ 问答频道 /正文

Disclaimer:初学者,自学Python用户。在

ndarray的一个相当酷的特性是它们能够接受整数元组作为索引(例如myNDArray[(1,2)] == myNDArray[1][2])。这允许我将索引保留为变量(例如indicesTuple),直到脚本确定要使用ndarray的哪个部分,在这种情况下,变量被指定为整数的元组并用于访问ndarray的一部分(例如myNDArray[indicesTuple])。使用变量的实用性在于,元组的长度可以根据ndarray的维度而变化。在

但是,这限制了我处理数值数组。我尝试过使用列表,但是它们不能接受元组作为索引(例如,myList[(1,2)]会出错)。有没有一种方法可以像函数参数那样“展开”列表索引的元组?或者更简单或更有效的方法?在

更新:天哪,我忘了这个存在。基本上,我最终了解到可以使用参数dtype=object初始化ndarray,这允许ndarray包含多种类型的Python对象,就像一个列表。至于访问列表,正如一位评论者所指出的,我可以使用for循环遍历变量indicesTuple来访问列表中越来越多的嵌套元素。对于就地编辑,请参阅已接受的评论,真的做了额外的努力。在


Tags: 方法用户脚本列表情况整数特性disclaimer
3条回答

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"。在

稍微相关的是,您可以使用dictionary精确地模拟稀疏数组,方法是使用元组作为默认dict的键

^{pr2}$

任何其他试图用作键的元组都将返回空字符串。这不是一个完美的模拟,因为如果不使用

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

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

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

以及一些你想要索引的2D列表

^{pr2}$

您可以使用下面的列表理解来获得这些元素

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

那么你的索引可以是你想要的。它们将在列表理解中解包,并用作列表索引。对于您的特定应用程序,我们必须了解索引变量的来源,但这是基本思想。在

我把你的问题解释为:

I have an N-dimensional list, and a tuple containing N values (T1, T2... TN). How can I use the tuple values to access the list? I don't know what N will be ahead of time.

我不知道有什么内置的方法可以做到这一点,但是您可以编写一个方法来迭代地挖掘列表,直到到达最里面的值为止。在

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)

结果:

^{pr2}$

您也可以使用reduce在一行中完成此操作,尽管读者不太清楚您要实现的目标。在

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

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


如果要在N维列表中设置值,请使用get访问列表的第二个最深级别,并将其赋值。在

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

相关问题 更多 >