【问题标题】:Converting some elements of a list of a dataset to float将数据集列表的某些元素转换为浮点数
【发布时间】:2017-01-22 22:52:21
【问题描述】:

我正在读取一个 csv 文件,并且所有行都包含字符串元素。一种可能是:

"orange", "2", "65", "banana" 

我想在我的数据集中将其更改为:

row = ["orange", 2.0, 65.0, "banana"]

这是我的代码:

data = f.read().split("\n")
for row in data:
    for x in row:
        if x.isdigit():
            x = float(x)
    print row

但它仍然会打印原始行,例如:

 "orange", "2", "65", "banana"

我也想在不使用列表推导的情况下实现这一点(目前)。

【问题讨论】:

    标签: list python-2.7 for-loop type-conversion


    【解决方案1】:

    我相信这是因为您无法像那样编辑行数组。 x 变量实际上并不引用数组中的元素,而是引用它的副本,因此您所做的所有更改都会在您完成对数组的迭代后消失。

    我不确定这是否是惯用的“python 方式”,但您可以这样做:

    data = f.read().split("\n")
    for row in data:
        parsed_row = []
        for x in row:
            if x.isdigit():
                x = float(x)
            parsed_row.append(x)
        print parsed_row 
    

    JGreenwell 在 cmets 中提供的另一种更“pythonic”的方式可能是在无法将元素解析为浮动时允许引发异常。

    data = f.read().split("\n")
    for row in data:
        parsed_row = []
        for x in row:
            try: 
                parsed_row.append(float(x)) 
            except ValueError: 
                parsed_row.append(x)
        print parsed_row 
    

    我想这真的取决于个人喜好。 Python 异常不应该很慢,所以我不会担心这一点。

    【讨论】:

    • 这是 OP 遇到的问题,更 Pythonic 的方式可能是“请求宽恕而不是许可”的成语。意思是使用 try/except 块:try: parsed_row.append(float(x)) except ValueError: parsed_row.append(x) - 此方法是 shown here 但其他答案显示了根据要求执行此操作的各种方法
    【解决方案2】:

    也许是你的分隔符。尝试类似

    with open('yourfile.csv', 'rb') as csvfile:
        reader = csv.reader(csvfile, delimiter=',', quotechar='|')
        for row in reader:
            for x in row:
                if x.isdigit():
                     print(float(x))
    

    【讨论】:

      猜你喜欢
      • 2018-06-10
      • 2016-01-29
      • 2021-11-25
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多