3

我正在尝试从另一个列表中的索引获取具有特定输出的列表,例如:

L = [(0, 1, 2, 3, 4, 5), (6, 7, 8, 9, 10,...etc), (...etc)]
multiple_index = [entry[0, 3, 4] for entry in L] 
#----> I know this specific code is wrong

如果上面的代码可以输出,我会喜欢它:

[(0, 3, 4), (6, 9, 10), (...etc)]

如果可能的话,我希望主列表中每个索引中的各个子索引按所示进行分组,并且想知道我可以使用什么代码来正确完成此操作,谢谢。

编辑:另外,我如何格式化它以干净地显示为行,我使用 .writelines 和单独的输出行将它们输出到文本文件,再次感谢!

4

7 回答 7

9

使用operator.itemgetter()

from operator import itemgetter

multiple_index = map(itemgetter(0, 3, 4), L)

或在列表理解中:

multiple_index = [itemgetter(0, 3, 4)(i) for i in L]
于 2013-06-21T19:44:13.667 回答
3

这是一种选择:

L = [(0, 1, 2, 3, 4, 5), (6, 7, 8, 9, 10, 11), (11, 12, 13, 14, 15, 16)]
multiple_index = [(entry[0], entry[3], entry[4]) for entry in L] 

或使用operator.itemgetter()

from operator import itemgetter
indices = itemgetter(0, 3, 4)
multiple_index = [indices(entry) for entry in L] 
于 2013-06-21T19:43:55.153 回答
2

你对此感兴趣吗?

L = [(0, 1, 2, 3, 4, 5), (6, 7, 8, 9, 10,...etc), (...etc)]
multiple_index = [(entry[0], entry[3], entry[4]) for entry in L] 
#----> I know this specific code is wrong
于 2013-06-21T19:44:21.657 回答
2
from operator import itemgetter
get = itemgetter(0, 3, 4)
L = [(0, 1, 2, 3, 4, 5), (6, 7, 8, 9, 10,...etc), (...etc)]
multiple_index = [get(entry) for entry in L]

对于更实用的风格:

multiple_index = map(itemgetter(0, 3, 4), L)

当然,如果您使用的是 numpy,您可以执行以下操作:

import numpy as np
L = np.array([(0, 1, 2, 3, 4, 5), (6, 7, 8, 9, 10, 11), (11, 12, 13, 14, 15, 16)])
multiple_index = L[:,(0, 3, 4)]

导致:

array([[ 0,  3,  4],
       [ 6,  9, 10],
       [11, 14, 15]])

就个人而言,我最喜欢 numpy 版本,但这需要您安装 numpy。如果您有兴趣,这里有更多关于 numpy 索引的信息:http: //docs.scipy.org/doc/numpy/reference/arrays.indexing.html

Numpy 也有一些简洁的快捷方式/技巧,用于使用np.s_np.r_np.c_.

于 2013-06-21T19:49:42.753 回答
2

只是为了一些多样性,这里有一种方法itertools.compress

>>> from itertools import compress, count
>>> indices = {0,3,4}
>>> items_at = lambda indices: (1 if n in indices else 0 for n in count())
>>> [tuple(compress(e, items_at(indices))) for e in L]
[(0, 3, 4), (6, 9, 10)]
于 2013-06-21T19:55:21.890 回答
0

列表元组和字典查找是使用它们的getitem方法实现的

myarray=[0,1,2]
print myarray[1]
#result:1
#equivalent to
print myarray.__getitem__(1)

您可以通过每个列表的getitem函数映射所需的索引。这将返回一个列表,其中包含每个列表的这些索引处的项目。修改您的示例代码:

L = [(0, 1, 2, 3, 4, 5), (6, 7, 8, 9, 10,...etc), (...etc)]
multiple_index = [map(entry.__getitem__,[0, 3, 4]) for entry in L]

这会产生所需的输出。

有关 python 魔术方法的更多信息,请参见

于 2013-07-23T00:29:31.020 回答
0

这是我的做法:

    L=[tuple(range(0,6*1)),tuple(range(6*1,6*2)),tuple(range(6*2,6*3))]
    print [tuple(map(lambda i: entry[i],[0,3,4])) for entry in L]
于 2014-07-04T06:17:11.927 回答