【问题标题】:How to apply a function to an element at a particular position in every tuple inside a tuple of tuples?如何将函数应用于元组元组内每个元组中特定位置的元素?
【发布时间】:2014-03-03 08:26:33
【问题描述】:

我有这个元组的元组;

Tuple = ( ('AA', 'BB', datetime.datetime(2014, 3, 2, 0, 0) ), ('CC', 'DD', datetime.datetime(2014, 3, 2, 0, 1) )  )

我想把它改成这样;

Output= ( ('AA', 'BB', '2014-3-2 00:00:00' ), ('CC', 'DD', '2014-3-2 00:00:00'  )

每个元组的第三个元素将被转换为表示日期时间的字符串。这可以通过类似Tuple[0][2].strftime('%Y-%m-%d %H:%M:%S')

我遇到的问题是如何将这个函数 strftime() 应用于这个元组中每个元组的第三个元素?

【问题讨论】:

    标签: python python-2.7 tuples


    【解决方案1】:

    您必须再次生成元组。您可以使用以下列表推导来做到这一点。

    >>> [(a, b, date.strftime('%Y-%m-%d %H:%M:%S')) for (a, b, date) in Tuple]
    [('AA', 'BB', '2014-03-02 00:00:00'), ('CC', 'DD', '2014-03-02 00:01:00')]
    

    如果最终结果需要是一个元组,请使用tuple()。这个使用了生成器表达式,但基本上是一样的:

    >>> tuple((a, b, date.strftime('%Y-%m-%d %H:%M:%S')) for (a, b, date) in Tuple)
    (('AA', 'BB', '2014-03-02 00:00:00'), ('CC', 'DD', '2014-03-02 00:01:00'))
    

    【讨论】:

    • @msvalkon 哦,我也只是建议过。 :p
    【解决方案2】:

    @msvalkon 提到的列表理解,或使用maplambda

    In [731]: map(lambda tup: (tup[0], tup[1], tup[2].strftime('%Y-%m-%d %H:%M:%S')), Tuple)
    Out[731]: [('AA', 'BB', '2014-03-02 00:00:00'), ('CC', 'DD', '2014-03-02 00:01:00')]
    

    【讨论】:

      【解决方案3】:

      这里有一个 generator function 可以解决问题。

      import datetime
      
      def convert_nested(nested_tuples):
          for a, b, time in nested_tuples:
              yield (a, b, time.strftime('%Y-%m-%d %H:%M:%S'))
      
      if __name__ == '__main__':
          nested_tuples = (('AA', 'BB', datetime.datetime(2014, 3, 2, 0, 0)),
                           ('CC', 'DD', datetime.datetime(2014, 3, 2, 0, 1)))
      
          output = tuple(convert_nested(nested_tuples))
      
          print(output)
      

      或者更简洁的生成器理解。

      import datetime
      
      if __name__ == '__main__':
          nested_tuples = (('AA', 'BB', datetime.datetime(2014, 3, 2, 0, 0)),
                           ('CC', 'DD', datetime.datetime(2014, 3, 2, 0, 1)))
      
          output = tuple((a, b, time.strftime('%Y-%m-%d %H:%M:%S')) 
                         for a, b, time in nested_tuples)
      
          print(output)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-22
        • 1970-01-01
        • 1970-01-01
        • 2021-05-25
        • 1970-01-01
        • 2015-09-09
        • 1970-01-01
        相关资源
        最近更新 更多