Itemgetter除外列

时间:2018-11-07 17:51:18

标签: python

是否有一种方法可以使用itemgetter来获取一组列的补码?

例如,您可以使用

获取列表的第一,第三和第五个元素
from operator import itemgetter
f = itemgetter(0, 2, 4)
f(['a', 'b', 'c', 'd', 'e']) ## == ('a', 'c', 'e')

是否有一种(简单而高效的)方式来获取所有元素,除了第一,第三和第五个

3 个答案:

答案 0 :(得分:2)

不,除了Python中的这些索引之外,没有其他方法可以拼写所有内容。

您必须锁定所有输入的长度,并对包含的 索引进行硬编码,所以 // Add Mobile Menu Button $('nav').before('<button class=".menu-btn" role="button" aria-pressed="false"><span>toggle menu</span></button>'); // Add toggles to menus $('nav .sub-menu').before('<button class="sub-menu-toggle" role="button" aria-pressed="false"></button>'); $('.menu-btn').css ({ 'top':'unset', 'right':'unset', 'left':'10px', 'bottom':'15px', 'z-index':'100', 'position':'fixed' }); ,但是随后您将只能处理特定对象。长度。

如果您输入的内容是可变长度,那么一个较远的选择是使用切片来获取第4个元素之后的所有内容:

itemgetter(*(i for i in range(fixed_list_length) if i not in {0, 2, 4}))

但随后您将获得切片组件的单独列表:

itemgetter(1, 3, slice(5, None))

,如果输入序列的长度不小于4个元素,则会发生错误:

>>> itemgetter(1, 3, slice(5, None))(['a', 'b', 'c', 'd', 'e', 'f', 'g'])
('b', 'd', ['f', 'g'])

与其使用>>> itemgetter(1, 3, slice(5, None))(['a', 'b', 'c']) Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range ,不如使用集和使用列表理解的lambda:

itemgetter()

该可调用对象可用于任何长度的输入:

def excludedgetter(*indices):
    excluded = set(indices)
    return lambda seq: [v for i, v in enumerate(seq) if i not in excluded]

那些随机长度的列表没问题。

答案 1 :(得分:1)

由于您具体询问的是itemgetter():您可以使用set来获得区别:

>>> from operator import itemgetter

>>> obj = ['a', 'b', 'c', 'd', 'e']
>>> c = {1, 3, 5}  # Get everything but these
>>> get = set(range(len(obj))).difference(c)
>>> f = itemgetter(*get)
>>> f(obj)
('a', 'c', 'e')

其中set(range(len(obj)))是所有索引,即{0, 1, 2, 3, 4}


免责声明:鉴于集合是无序的,因此这不能保证排序。尽管效率较低,但是使用以下命令可能会更安全:

f = itemgetter(*sorted(get))

要保证,这要求您在调用itemgetter()之前预先知道列表的长度,并要求调用该函数以索引每个列表。

答案 2 :(得分:1)

您正在寻找准矢量化操作。使用常规Python甚至使用结果为数组的第三方NumPy都是不可能的。但是后者确实提供了语法上的好处:

import numpy as np

A = ['a', 'b', 'c', 'd', 'e']

exc = [0, 2, 4]

res1 = [val for idx, val in enumerate(A) if idx not in exc]
res2 = np.delete(A, exc).tolist()

assert res1 == res2

如果使用列表推导,则应该先将exc转换为set,以启用O(1)查找。