gpt4 book ai didi

python - Itemgetter 除了列

转载 作者:太空狗 更新时间:2023-10-30 01:11:10 24 4
gpt4 key购买 nike

有没有办法使用 itemgetter 获取一组列的补码?

例如,您可以使用

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

是否有一种(简单且高效的)方法来获取所有元素除了第一个、第三个和第五个?

最佳答案

不,没有办法在 Python 中拼写除了这些索引之外的所有内容

您必须锁定所有输入的长度并对包含索引进行硬编码,因此itemgetter(*(i for i in range(fixed_list_length) if i not in {0 , 2, 4})),但是这样你就只能处理特定长度的对象了。

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

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

但是你会得到一个单独的切片组件列表:

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

如果输入序列的长度不是至少 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

与其使用 itemgetter(),不如使用一个集合和一个使用列表理解的 lambda:

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

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

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

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

关于python - Itemgetter 除了列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53195023/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com