Python列表理解与多个变量

时间:2013-06-21 19:42:49

标签: python list list-comprehension

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

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和单独输出行的文本文件中,再次感谢!

7 个答案:

答案 0 :(得分:8)

使用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]

答案 1 :(得分: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] 

答案 2 :(得分: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

答案 3 :(得分: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_进行花式切片和范围构建的简洁快捷键/技巧。

答案 4 :(得分: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)]

答案 5 :(得分:0)

列表元组和dictioonary查找是使用 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魔术方法的更多信息,请参阅this

答案 6 :(得分: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]