Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将元组转换为索引? 在第一次看来,这似乎是微不足道的,但令人惊讶的是,我还没有在网上找到任何答案——考虑下面的列表: my_list = [[1,2,3], [4,5,6], [7,8,9]]_Python_Python 2.7 - Fatal编程技术网

Python 将元组转换为索引? 在第一次看来,这似乎是微不足道的,但令人惊讶的是,我还没有在网上找到任何答案——考虑下面的列表: my_list = [[1,2,3], [4,5,6], [7,8,9]]

Python 将元组转换为索引? 在第一次看来,这似乎是微不足道的,但令人惊讶的是,我还没有在网上找到任何答案——考虑下面的列表: my_list = [[1,2,3], [4,5,6], [7,8,9]],python,python-2.7,Python,Python 2.7,为了得到5,我可以按5的位置去我的列表[1][1] 假设我有以下元组: t = (1, 1) 我可以使用这个元组以更吸引人的方式得到5,而不是我的列表[t[0]][t[1]] 编辑:请同时考虑作业,即更具吸引力 my_list[t[0]][t[1]] = value 以及不一定是数字的最终元素,例如[[['a',b'],['c',d']]您可以使用元组解包来获取元组值(最终将索引列成变量) 使用reduce: result = reduce(lambda acc, i: acc[i], t,

为了得到5,我可以按5的位置去
我的列表[1][1]

假设我有以下元组:

t = (1, 1)
我可以使用这个元组以更吸引人的方式得到5,而不是
我的列表[t[0]][t[1]]

编辑:请同时考虑作业,即更具吸引力

my_list[t[0]][t[1]] = value

以及不一定是数字的最终元素,例如
[[['a',b'],['c',d']]

您可以使用元组解包来获取元组值(最终将索引列成变量)


使用
reduce

result = reduce(lambda acc, i: acc[i], t, my_list)
演示:

更新 如果需要更新:

reduce(lambda acc, i: acc[i], t[:-1], my_list)[t[-1]]
返回一个“左值”(如果我可以这么说的话)。但是,由于表达的一致性被打破,它变得丑陋起来。实际上,它也不能包装成函数

我建议编写一个简单的包装器,如下所示:

class mdlist(list):
    def __getitem__(self, item):
        if isinstance(item, tuple):
            assert len(item) >= 1
            return self[item[0]][item[1:]] if len(item) > 1 else self[item[0]]
        else:
            return super(mdlist, self).__getitem__(item)

    def __setitem__(self, item, value):
        if isinstance(item, tuple):
            assert len(item) >= 1
            if len(item) > 1:
                self[item[0]][item[1:]] = value
            else:
                self[item[0]] = value
        else:
            super(mdlist, self).__setitem__(item, value)

它不需要比你想象的更多的东西,可以让你的生活轻松很多。

你可以编写一个函数来实现这一点:

def nested_index(l, t):
    e = l
    for i in t:
        e = e[i]
    return e
然后您可以按以下方式调用该函数:

nested_index(my_list, t)

我认为NumPy套装正好适合您的需要。首先将列表转换为NumPy数组,然后可以通过其位置元组选择项目

import numpy as np

my_list = [[1,2,3], [4,5,6], [7,8,9]]
my_array = np.array(my_list)
t = (1, 1)
print my_array[t]

您可以创建
operator.itemgetter
对象并依次应用它们

两个嵌套级别的示例:

import operator
a = [[1,2,3], [4,5,6], [7,8,9]]
t = (1,2)
i1, i2 = map(operator.itemgetter, t)

>>> i2(i1(a))
6
n个嵌套级别的示例(您必须确保目标结构可以容纳元组的长度,可以用try/except包装它):

使用来自的两个函数更进一步


只是稍微好一点。我希望能有点像我的魔术师名单。太好了!但是像这样内置的东西有意义吗。。?奇怪的如果没有人会想出别的办法,我就拿它来说:)@Kludge据我所知,没有这样的东西。您可以使用for循环,也可以使用this。但是对于这样一段短的代码来说,使用for循环是非常愚蠢的。如果我需要为[t]位置分配一个新值呢?请注意,
reduce
在Python 3.x中被移动到
functools
module中。NumPy通过元组或NumPy数组索引项。请看:我在发帖之前已经试过了。如果你仍然不相信,有一个相似的答案。天哪,你说得对。我的翻译怎么了?
import numpy as np

my_list = [[1,2,3], [4,5,6], [7,8,9]]
my_array = np.array(my_list)
t = (1, 1)
print my_array[t]
import operator
a = [[1,2,3], [4,5,6], [7,8,9]]
t = (1,2)
i1, i2 = map(operator.itemgetter, t)

>>> i2(i1(a))
6
a = [[[1,2,3], [4,5,6]], [[7,8,9],['a','b','c']]]
t = (0,1,0) # should produce 4
z = a[:]
for op_ig in map(operator.itemgetter, t):
    z = op_ig(z)

>>> z
4
from functionally import compose, thrush
a = [[[1,2,3], [4,5,6]], [[7,8,9],['a','b','c']]]
t = (1,1,0) # should produce a
foo = compose(*map(operator.itemgetter, reversed(t)))

>>> foo(a)
'a'
>>> thrush(a, *(operator.itemgetter(i) for i in t))
'a'