gpt4 book ai didi

python - 使用 itemgetter 测试是否相等

转载 作者:行者123 更新时间:2023-11-28 22:02:28 24 4
gpt4 key购买 nike

from operator import itemgetter
from itertools import takewhile

xs = [ ('foo',1), ('bar',1), ('baz',2) ]

xs 按第二项排序 - 'bar' 之后不再有 1

def item_map(xs):
getcount = itemgetter(1)
return list(map(getcount,xs))

print(item_map(xs))
>>> [1, 1, 2]

返回每个元组的第二个元素的列表。

def item_take(xs):   
return list(takewhile(lambda x: x[1] == 1, xs))

print(item_take(xs))
[('foo', 1), ('bar', 1)]

返回第二个元素 == 1 的元组。

def could_this_work(xs):
match = itemgetter(1) == 1
return list(takewhile(match, xs))

print(could_this_work(xs))
TypeError: 'bool' object is not callable

不返回第二个元素 == 1 的元组

有没有办法使用 itemgetter 代替 lambda?或者itemgetter不能这样用吗?

编辑。 takewhile 的使用是有原因的。我明白它的作用。此函数将用于排序列表。我很欣赏元组为此倒退,但我使用它的代码正确地满足了我的需求和期望。

最佳答案

您的 lambda 函数实际上是两个函数的组合:operator.itemgetter(1)operator.eq。以纯函数式风格执行此操作需要一个 compose() 函数,如下所示:

def compose(f, g):
def composed(x):
return f(g(x))
return composed

使用这个函数,你可以做

from operator import itemgetter, eq
from functools import partial

def take_items(a):
return takewhile(compose(partial(eq, 1), itemgetter(1)), a)

不过,我认为这不是什么好主意。我可能会直截了当

def take_items(a):
for x in a:
if x[1] != 1:
break
yield x

我认为这需要代码读者的部分思考较少。

关于python - 使用 itemgetter 测试是否相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11155957/

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