在列表理解中将字符串转换为整数

时间:2018-07-21 12:56:00

标签: python python-3.x list

我正在尝试编写一个函数,该函数接受文件并用新行将其分割,然后再次使用逗号delimiter(,)对其进行分割,之后我想仅使用列表理解将列表内的每个字符串转换为整数< / p>

# My code but it's not converting the splitted list into integers.
def read_csv(filename):
    string_list = open(filename, "r").read().split('\n')
    string_list = string_list[1:len(string_list)]
    splitted = [i.split(",") for i in string_list]
    final_list = [int(i) for i in splitted]
    return final_list

read_csv("US_births_1994-2003_CDC_NCHS.csv")

Output:
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list' 
  

使用逗号分隔符(,)分割后的数据外观

us = open("US_births_1994-2003_CDC_NCHS.csv", "r").read().split('\n')
splitted = [i.split(",") for i in us]
print(splitted)

Output:
 [['year', 'month', 'date_of_month', 'day_of_week', 'births'],
 ['1994', '1', '1', '6', '8096'],
 ['1994', '1', '2', '7', '7772'],
 ['1994', '1', '3', '1', '10142'],
 ['1994', '1', '4', '2', '11248'],
 ['1994', '1', '5', '3', '11053'],
 ['1994', '1', '6', '4', '11406'],
 ['1994', '1', '7', '5', '11251'],
 ['1994', '1', '8', '6', '8653'],
 ['1994', '1', '9', '7', '7910'],
 ['1994', '1', '10', '1', '10498']]

如何使用列表理解将输出中的每个字符串转换为整数并将其分配给单个列表。

1 个答案:

答案 0 :(得分:4)

str.split()产生一个新列表;因此splitted是一个列表列表。您想要转换每个包含列表的内容:

[[int(v) for v in row] for row in splitted]

演示:

>>> csvdata = '''\
... year,month,date_of_month,day_of_week,births
... 1994,1,1,6,8096
... 1994,1,2,7,7772
... '''
>>> string_list = csvdata.splitlines()  # better way to split lines
>>> string_list = string_list[1:]  # you don't have to specify the second value
>>> splitted = [i.split(",") for i in string_list]
>>> splitted
[['1994', '1', '1', '6', '8096'], ['1994', '1', '2', '7', '7772']]
>>> splitted[0]
['1994', '1', '1', '6', '8096']
>>> final_list = [[int(v) for v in row] for row in splitted]
>>> final_list
[[1994, 1, 1, 6, 8096], [1994, 1, 2, 7, 7772]]
>>> final_list[0]
[1994, 1, 1, 6, 8096]

请注意,您也可以直接在文件上循环以获取单独的行:

string_list = [line.strip().split(',') for line in openfileobject]

并通过next(iterableobject, None)跳过此类对象中的条目。

您可以使用csv module

,而不是将整个文件读入内存并手动拆分数据。
import csv

def read_csv(filename):
    with open(filename, 'r', newline='') as csvfile:
        reader = csv.reader(csvfile)
        next(reader, None)  # skip first row
        for row in reader:
            yield [int(c) for c in row]

上面是一个生成器函数,当您遍历它时,一次生成一行:

for row in read_csv("US_births_1994-2003_CDC_NCHS.csv"):
    print(row)

您仍然可以使用list(read_csv("US_births_1994-2003_CDC_NCHS.csv"))来获取所有行的列表。