是否有一种方法可以使用itemgetter
来获取一组列的补码?
例如,您可以使用
获取列表的第一,第三和第五个元素from operator import itemgetter
f = itemgetter(0, 2, 4)
f(['a', 'b', 'c', 'd', 'e']) ## == ('a', 'c', 'e')
是否有一种(简单而高效的)方式来获取所有元素,除了第一,第三和第五个?
答案 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)查找。