繁体   English   中英

在python中,如何将字典中的字符串列表转换为整数列表?

[英]in python, how do you convert a list of strings within a dictionary to a list of integers?

我有一个函数(main),它从 csv 文件中获取数据并将其转换为字典,其键是第一列中的条目,它们的值是该行中所有其他条目的列表(例如:一行是: 2020-12-20,0,0,0,0,206,因此键是2020-12-20 ,其余条目是列表中的字符串: ['0', '0', '0', '0', '206'] ):

def main():
    import csv
    # doses_data_mar_20.csv
    dict_doses_by_date = {}

    filename_input = str(input("Please enter a .csv file to read: "))
    with open(filename_input, "r") as inp, open('doses.csv', 'w') as out:
        header = inp.readline()
        reader = csv.reader(inp, delimiter=",", quotechar='"')
        for line in reader:
            dict_doses_by_date[line[0]] = line[1:6]
    return dict_doses_by_date

def count_doses_by_date(dict_dose_by_date):

现在我需要定义一个新函数count_doses_by_date ,它将每个字符串列表作为输入,并将这些字符串列表中的每一个转换为整数列表,并将所有整数相加以获得它们的总数。 然后将其输出到另一个 csv 文件中。

我试过这样做:

def count_doses_by_date(dict_dose_by_date):
    import csv
    # doses_data_mar_20.csv
    dict_doses_by_date = {}
    filename_input = str(input("Please enter a .csv file to read: "))
    with open(filename_input, "r") as inp, open('doses.csv', 'w') as out:
        header = inp.readline()
        reader = csv.reader(inp, delimiter=",", quotechar='"')
        for line in reader:
            dict_doses_by_date[line[0]] = line[1:6]
        for k in dict_doses_by_date:
            list_integers = [int(x) for x in dict_doses_by_date[k]]
            sum_integers = sum(list_integers)
            print_value = "{}, {} \n".format(k, sum_integers)
    return out.write(print_value)

但我收到错误,因为某些列表包含像 '1,800' 这样的字符串,其中包含阻止将其转换为整数的逗号。 我不知道如何在不破坏分隔 csv 值的逗号的情况下摆脱数千个逗号。

我被卡住了..这将如何完成?

因此,如果您的字符串类似于“1234”,您可以这样做

int(number, base=base)

你会得到一个整数。 例如:

print(int("1234"))

将打印 1234 号码。

请在此处查看其余文档: https ://docs.python.org/3/library/functions.html#int

然后要真正实现您想要的,您可以按照其他评论的建议或您想要的任何方式进行操作,只需遍历元素列表并继续添加它们 (a+= int("1234")) 然后返回总数并写入它到文件中。

当然,如果您的字符串有意外的符号,例如“千个逗号”,那么您需要在调用int()之前通过使用replace()或其他方式删除字符来规范化字符串。

你会试试这个吗? 使用string.isdigit()判断是否为数字

line = ['2020-12-20', '0', '0', '0', '0', '206']
filtered_line = [int(e) if e.isdigit() else '' for e in line[1:6]]
print([x for x in filtered_line if x != ''])

输出

[0, 0, 0, 0, 206]

编辑:我错过了关于千位分隔符的部分。 在您的用例中,代码可能是这样的:

dict_doses_by_date = {}
reader = [['2020-12-20', '0', '0', '0', '10', '206'], ['2020-12-21', '0', '0', '0', '20', '316'], ['2020-12-22', '0', '0', '0', '30', '1,426']]

for line in reader:
    list_integers = [int(x.replace(',', '')) for x in line[1:6]]
    dict_doses_by_date[line[0]] = list_integers
    print_value = "{}, {} \n".format(line[0], sum(list_integers))
    print(print_value)

print(dict_doses_by_date)

输出

2020-12-20, 216

2020-12-21, 336

2020-12-22, 1456

{'2020-12-20': [0, 0, 0, 10, 206], '2020-12-21': [0, 0, 0, 20, 316], '2020-12-22': [0, 0, 0, 30, 1426]}

您应该使用 pandas 库。 您可以使用pd.read_csv直接从文件中获取数据框,并且可以将第一列设置为索引列。 您可以使用df.applymap(lamba x : int(x.replace(',',''))摆脱逗号并转换为 int,然后执行df.sum(axis = 1)以获得一行-逐行总和。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM