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