【问题标题】:How to pick certain elements of x-tuple returned by a function?如何选择函数返回的 x 元组的某些元素?
【发布时间】:2009-10-01 07:47:46
【问题描述】:

我是 Python 的新手。考虑函数str.partition(),它返回一个三元组。如果我只对此元组的元素 0 和 2 感兴趣,那么从这样的元组中只选择某些元素的最佳方法是什么?

我目前可以:

# Introduces "part1" variable, which is useless
(part0, part1, part2) = str.partition(' ')

或者:

# Multiple calls and statements, again redundancy
part0 = str.partition(' ')[0]
part2 = str.partition(' ')[2]

我希望能够像这样做某事,但不能:

(part0, , part2) = str.partition(' ')
# Or:
(part0, part2)   = str.partition(' ')[0, 2]

【问题讨论】:

    标签: python list tuples iterable-unpacking


    【解决方案1】:

    下划线通常用作你不需要的东西的名称,所以这样的东西会起作用:

    part0, _, part2 = str.partition(' ')
    

    在这种特殊情况下,您可以这样做,但这不是一个很好的解决方案:

    part0, part2 = str.partition(' ')[::2]
    

    更深奥的解决方案:

    from operator import itemgetter
    part0, part2 = itemgetter(0, 2)(str.partition(' '))
    

    【讨论】:

    • 下划线作为变量名真的很酷!多么巧妙的把戏! :-)
    • 你不能使用那种“通配符”语法。
    • 请注意,gettext 经常使用 _,因此您可能不想这样做。
    • 谢谢! _ 技巧在这里很有效,你的 itemgetter 解决方案将是我需要挑选更多元素的情况的一个很好的解决方案。
    • @SilentGhost:感谢指正,我只是简单地阅读了 PEP,并没有自己使用过。 @foosion:它唯一的美学,下划线在视觉上“让开”。它在 Python 中很常见,即使 pylint 默认不将变量“_”和“dummy”报告为未使用。
    【解决方案2】:

    正确,您不能一次性从元组列表中取出多个临时元素。

    part0, part1, part2 = str.partition(' ')
    

    是要走的路。不用担心part1,如果你不需要它,你就不需要它。通常称它为“虚拟”或“未使用”以表明它没有被使用。

    你可能会变得丑陋:

    part0, part2 = str.partition(' ')[::2]
    

    在这种特定情况下,但这会让人感到困惑并且对其他人不好。 ;)

    【讨论】:

      【解决方案3】:

      我想我前段时间问的一个问题可以帮助你:

      Pythonic way to get some rows of a matrix

      NumPy 为您提供了您想要使用元组或索引列表提取各种元素的切片语法,但我认为您不想将字符串列表转换为 numpy.array 只是为了提取一些元素,所以也许你可以写一个助手:

      def extract(lst, *indices):
          return [lst[i] for i in indices]
      
      item0, item2 = extract(str.partition(' '), 0, 2)
      

      【讨论】:

        【解决方案4】:

        您也可以使用str.split(' ', 1) 代替str.partition(' ')

        你会得到一个列表而不是一个元组,但你不会得到分隔符

        【讨论】:

          【解决方案5】:

          我会这样做:

          all_parts = str.partition(' ')
          part0, part2 = all_parts[0], all_parts[2]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-11-29
            • 1970-01-01
            • 2012-01-22
            • 2021-10-21
            • 2018-04-28
            • 1970-01-01
            • 1970-01-01
            • 2020-07-09
            相关资源
            最近更新 更多