【问题标题】:Create new list from nested list and convert str into float从嵌套列表创建新列表并将字符串转换为浮点数
【发布时间】:2017-09-09 19:41:24
【问题描述】:

很抱歉问了一个以前被问过一百次的问题,我是 Python 新手,我找到的解决方案似乎都不能解决我的问题。

我有一个来自名为糖尿病的 csv 文件的嵌套列表,我在文件中读取并用逗号分隔这样的元素

for line in open("diabetes.csv"):
    lst=line.strip().split(",")
    print(lst)

打印出以下内容

['10', '101', '86', '37', '0', '45.6', '1.136', '38', '1']
['2', '108', '62', '32', '56', '25.2', '0.128', '21', '0']
['3', '122', '78', '0', '0', '23', '0.254', '40', '0']

现在我的问题是

  1. 我需要创建一个单独的列表,其中仅包含每个列表的第三个元素 (lst[2])
  2. 我需要将它转换成浮点数而不是字符串。

我正在使用 Python 3.6,我正在把头发拉出来。

【问题讨论】:

  • 使用 CSV 阅读器,如 pandas 或标准库 csv 模块。尽量避免重新发明轮子。
  • 你可以在每个循环中在col3 = []col3.append(float(lst[2]))之外声明一个数组。虽然我同意使用标准的 csv 模块可能会更好,但自定义实现确实提供了更大的灵活性。

标签: python python-3.x csv


【解决方案1】:

假设你有一个字符串列表:

LoL=[
   ['10', '101', '86', '37', '0', '45.6', '1.136', '38', '1'],
   ['2', '108', '62', '32', '56', '25.2', '0.128', '21', '0'],
   ['3', '122', '78', '0', '0', '23', '0.254', '40', '0'],
]

您可以像这样获取每个子列表的nth 元素:

>>> [float(sl[2]) for sl in LoL]
[86.0, 62.0, 78.0]

如果您有 csv 文件,请使用 csv module 执行完全相同的操作:

(在命令提示符下):

$ cat file.csv
10,101,86,37,0,45.6,1.136,38,1
2,108,62,32,56,25.2,0.128,21,0
3,122,78,0,0,23,0.254,40,0

Python:

import csv
with open('file.csv') as f:
  items=[float(row[2]) for row in csv.reader(f)]

>>> items
[86.0, 62.0, 78.0]

所以——底线:

  1. 请使用csvpandas而不是.split(','),以便您可以正确处理引用的csv和其他特殊性;
  2. 使用with 上下文管理器,使文件在块结束时自动关闭;
  3. csv 文件与列表列表非常相似,通常可以以相同的方式处理。

【讨论】:

    【解决方案2】:

    您可以使用pandas 模块,这在数据科学中非常标准:

    import pandas as pd
    
    df = pd.read_csv("diabetes.csv", header=None, index_col=None)
    df.iloc[:, 2] = pd.to_numeric(df.iloc[:, 2], downcast='float')
    list = df.iloc[:, 2]
    

    编辑
    注意,这里的输出类型是Series

    【讨论】:

      【解决方案3】:

      一个非常简单天真的一个班轮:

      result = [float(line.strip().split(",")[2]) for line in open("diabetes.csv")]
      

      【讨论】:

      • 天真是关键词。通过split 解释CSV 数据是一种不好的做法。使用csv 库。
      • 没有争论。不过,幼稚的方法在学习时可能非常有用,当您只想了解 for 循环时,最好不要埋在一堆库中。
      • 是的。教授一种在一般情况下有效的模式也很有帮助,因此一旦学会了它就永远有效。我认为“含电池”课程对 Python 来说尤其重要。
      【解决方案4】:

      您可以这样做:

      my_list = []
      
      with open("diabetes.csv", 'rb') as csvfile:
      
          for line in csvfile.readlines():
              lst = line.split(',')
              my_list.append(float(lst[2]))
      

      【讨论】:

      • 你的做法既幼稚又危险。使用csv 库。以这种简单的方式自己解释 CSV 行和字段不会处理引号和 CSV 语法的其他细微之处。
      • @ChrisJohnson 这样更好吗?
      猜你喜欢
      • 2013-01-30
      • 2016-02-08
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 2019-04-24
      • 1970-01-01
      相关资源
      最近更新 更多