【问题标题】:Python: tuple assignment while at same time converting typePython:元组赋值同时转换类型
【发布时间】:2015-05-04 06:33:54
【问题描述】:

我正在将字符串中的制表符分隔值读取到这样的对象中:

class Node(rect):
    def __init__(self, line):
        (self.id, self.x1, self.y1, self.x2, self.y2) = line.split('\t')

这很好,但假设我想将从字符串line 读取的那些 x 和 y 坐标转换为浮点数。最pythonic的方法是什么?我想像

(self.id, float(self.x1), float(self.y1), float(self.x2), float(self.y2)) = line.split('\t')

这当然行不通。有没有一种优雅的方法可以做到这一点,还是我必须像self.x1 = float(self.x1)一样事后手动转换?

【问题讨论】:

    标签: python floating-point type-conversion tuples


    【解决方案1】:

    你不能在一行中做到这一点,但你可以这样做:

    self.id, *rest = line.split('\t')
    self.x1, self.y1, self.x2, self.y2 = map(float, rest)
    

    如果你在 python2 上,那么你必须这样做:

    splitted = line.split('\t')
    self.id = splitted.pop(0)
    self.x1, self.y1, self.x2, self.y2 = map(float, splitted)
    

    【讨论】:

    • 哇,我从来没有听说过分配*rest这样的东西。太棒了!
    • @mkrieger1 这是python3独有的新功能。请参阅有关它的this 问题,定义它的PEP 3132。我相信在较新版本的 python 中,我们很快就会看到它的扩展(参见PEP 448,它应该在 python3.5 中出现)。
    【解决方案2】:

    这个问题我自己问过很多次了。

    我想出的最好方法是定义一个输入转换函数列表,然后用参数压缩它们:

    identity = lambda x: x
    input_conversion = [identity, float, float, float, float]
    self.id, self.x1, self.y1, self.x2, self.y2 = (
      f(x) for f, x in zip(input_conversion, line.split('\t')))
    

    【讨论】:

    • 对于更复杂的情况,这是您工具箱中的一个有用技巧。顺便说一句,您可以使用生成器表达式而不是列表推导(括号而不是方括号)来做到这一点。我认为这不会对性能产生任何影响(你不会解压缩 5000 个值......另外,我认为至少 CPython 无论如何都会创建一个列表),但从概念上讲你不需要一个列表,所以为什么要一个?
    • 很好的解决方案,尽管对我的用例来说有点矫枉过正。不过我会记住的!
    • 我不得不承认我自己很少用这个。这通常是重新设计代码的提示,以便一开始就避免原来的情况......
    • 我已经用csv 文件完成了这项工作。虽然我记得有两次这样做,但我最终将它重写为使用 csv.DictReader 的子类和从名称到类型的映射,而不是仅仅压缩 csv.reader 和类型的元组,以调试一些我计算过的愚蠢问题列错误...
    【解决方案3】:

    你不能做任何你想做的事情。但也有选择。

    在这种情况下,您尝试将除第一个值之外的所有值都转换为float。你可以这样做:

    bits = line.split('\t')
    self.id = bits.pop()
    self.x1, self.y1, self.x2, self.y2 = map(float, bits)
    

    【讨论】:

      猜你喜欢
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 2021-02-02
      • 2012-02-25
      • 2022-08-19
      • 2021-05-11
      • 2020-06-04
      相关资源
      最近更新 更多