【问题标题】:Python function that returns the value at index 0?返回索引0处的值的Python函数?
【发布时间】:2015-12-19 18:22:34
【问题描述】:

Python 标准库是否具有返回索引 0 处的值的函数?换句话说:

zeroth = lambda x: x[0]

我需要在像map() 这样的高阶函数中使用它。我问是因为我相信使用可重用函数而不是定义自定义函数更清楚 - 例如:

pairs = [(0,1), (5,3), ...]

xcoords = map(funclib.zeroth, pairs)  # Reusable
vs.
xcoords = map(lambda p: p[0], pairs)  # Custom

xcoords = [0, 5, ...]  # (or iterable)

我也问,因为 Haskell 确实有这样一个函数 Data.List.head,它作为高阶函数的参数很有用:

head :: [a] -> a
head (x:xs) = x
head xs = xs !! 0

xcoords = (map head) pairs

【问题讨论】:

  • 永远不要要求图书馆,这是题外话。我已经编辑了错误区域。下次小心点。
  • 在语言自己的标准库中请求函数有什么问题?
  • 我将进一步编辑这个问题以反映我的初衷。
  • 为了记录,原始问题的措辞方式没有任何问题。显示当前正在使用的代码并询问是否有使用标准库中工具的惯用方法。
  • 我现在很困惑,所以我在 meta 上问了一个关于这个的问题。感谢@Nayuki 帮助我消除了困惑。

标签: python list dictionary lambda


【解决方案1】:

你需要使用operator.itemgetter

>>> import operator
>>> pairs = [(0,1), (5,3)]
>>> xcoords = map(operator.itemgetter(0), pairs)
>>> xcoords
[0, 5]

在 Python3 中,map 返回一个地图对象,因此您需要对其进行 list 调用。

>>> list(map(operator.itemgetter(0), pairs))
[0, 5]

【讨论】:

  • 1分钟完美答案。我会在 15 分钟计时器到期后立即接受。
  • list(map(operator.itemgetter(0), pairs)) for python3
  • FWIW,我发现 lambda p: p[0]operator.itemgetter(0) 更清晰
  • @BhargavRao,itemgetter 比 lambda 快,所以它绝对不是为了性能
  • 对我来说更具可读性。 itemgetter 是一个返回函数的函数,它比我们这里需要的要复杂。不过,这只是我的看法。
【解决方案2】:

最 Pythonic 的方法可能是使用 operator.itemgetter(0)。它只返回这样一个函数。

另一种方法是直接致电obj.__getitem__。它不那么 Pythonic,因为它显式调用特殊方法名称,而不是允许 Python 推断内部调用什么。

【讨论】:

  • 我了解operator.itemgetter(),但第二个答案obj.__getitem__ 对解决问题有何帮助?
  • @NayukiMinase 因为它是一个函数而不仅仅是纯语法,您可以将它作为一个高阶函数来处理您的问题。
【解决方案3】:

list comprehension:

>>> pairs = [(0,1), (5,3)]
>>> xcoords = [ t[0] for t in pairs ]
>>> xcoords

【讨论】:

  • 这个答案基本上是在反省我的问题。
猜你喜欢
  • 2015-07-27
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
相关资源
最近更新 更多