有没有办法使用一组列的补充itemgetter?
例如,您可以使用获取列表的第一,第三和第五个元素
from operator import itemgetter
f = itemgetter(0, 2, 4)
f(['a', 'b', 'c', 'd', 'e']) ## == ('a', 'c', 'e')
Run Code Online (Sandbox Code Playgroud)
除了第一个,第三个和第五个之外,是否有(简单且高效)的方法来获取所有元素?
不,除了 Python 中的这些索引之外,没有办法拼写所有内容。
您必须锁定所有输入的长度并对包含的索引进行硬编码,所以itemgetter(*(i for i in range(fixed_list_length) if i not in {0, 2, 4})),但随后您将被锁定为仅处理特定长度的对象。
如果您的输入长度可变,那么一种遥远的选择是使用切片来获取第四个元素之后的所有内容:
itemgetter(1, 3, slice(5, None))
Run Code Online (Sandbox Code Playgroud)
但随后你会得到切片组件的单独列表:
>>> itemgetter(1, 3, slice(5, None))(['a', 'b', 'c', 'd', 'e', 'f', 'g'])
('b', 'd', ['f', 'g'])
Run Code Online (Sandbox Code Playgroud)
如果输入序列的长度不是至少 4 个元素,则会出现错误:
>>> 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
Run Code Online (Sandbox Code Playgroud)
不用 use itemgetter(),只需使用一个集合和一个使用列表理解的 lambda:
def excludedgetter(*indices):
excluded = set(indices)
return lambda seq: [v for i, v in enumerate(seq) if i not in excluded]
Run Code Online (Sandbox Code Playgroud)
该可调用可用于任何长度的输入:
>>> from random import randrange
>>> pile = [
... [randrange(10) for _ in range(randrange(8))]
... for _ in range(10)
... ]
>>> min(len(l) for l in pile), max(len(l) for l in pile)
(0, 6)
>>> sorted(pile, key=excludedgetter(0, 2, 4))
[[], [1], [9, 1, 8, 2, 4, 0], [0, 3], [7, 3, 4, 9, 7, 7], [8, 4, 4], [6, 4, 7, 9, 9], [0, 5, 3, 7, 2], [4, 6, 6, 0], [8, 8, 1]]
Run Code Online (Sandbox Code Playgroud)
那些随机长度的列表没有问题。
| 归档时间: |
|
| 查看次数: |
69 次 |
| 最近记录: |