【问题标题】:How do I convert dictionary list values to integers?如何将字典列表值转换为整数?
【发布时间】:2016-12-03 01:57:49
【问题描述】:

我正在使用 Python 3.5。我上传了一个 CSV 文件并将其制成字典。但是,每个键的多个值的列表是字符串而不是整数。如何将每个键的值转换为整数?

此外,未来的 CSV 导入是否有办法自动将字典值列表转换为整数?

到目前为止,这是我所拥有的:

import csv
reader = csv.reader(open('filename.csv'))
dictname = {}
for row in reader:
    key = row[0]
    if key in dictname:
        pass
    dictname[key] = row[1:]

print dictname

【问题讨论】:

  • 示例数据在哪里?

标签: python string dictionary integer python-3.5


【解决方案1】:

我使用一个函数首先检查该值是否为字符串/unicode。如果是这样,它会尝试将其转换为浮点数,例如“1,234.45”-> 1234.45。如果失败或该值不是字符串/浮点数,则函数将其原封不动地返回。

然后在列表推导中使用此函数来填充字典。

请注意,if key in dictname: pass 块不执行任何操作。如果您的数据中有重复的键,您有三种选择:

1) 用具有相同键值的新行覆盖现有键的数据(这是当前正在发生的事情)。

2) 只使用第一次出现的关键行。在这种情况下,请将pass 更改为continue

3) 尝试聚合数据。这更复杂,超出了您原始问题的范围,因此我将留给您找出或发布一个涵盖此范围的新问题。

def convert_to_numeric(value):
    if isinstance(i, (str, unicode)):
        try:
            result = float(value)
        except:
            pass  # Returns result on next line.
    return result

for row in reader:
    key = row[0]
    if key in dictname:
        pass  # This doesn't do anything. Use `continue` to avoid overwriting.
    dictname[key] = [convert_to_numeric(i) for i in row[1:]]

【讨论】:

    【解决方案2】:

    您可以使用pandas 并指定转换器功能。事实上,您甚至可能不需要这样做,因为它可以智能地解析 CSV 文件。

    import pandas as pd
    
    df = pd.read_csv('filename.csv')
    

    如果您需要转换器功能:

    df = pd.read_csv('filename.csv',converters={'yourintegercolumn':int})
    

    【讨论】:

    • 虽然这是一个选项 - 根据 OP 试图做什么,它可能是一个疯狂的方法的大锤......
    • @JonClements:好点。如果你认为我应该删除这个答案。
    • 由你决定 - 毕竟这是一个有效的答案......除非碰巧OP将对其进行需要熊猫的后期处理工作,我不确定它是否完全有用虽然...
    • 谢谢,@JonClements。我暂时离开它。
    【解决方案3】:

    如果 row 是包含字符串格式的整数的列表:

    dictname[key] = [int(elt) for elt in row[1:] if elt.isdigit()]
    

    应该做的伎俩

    【讨论】:

    • 我可以对所有键执行该操作吗?
    • 你应该可以,因为我从列表 row[1:] 中获取所有数字并从中创建一个 int 列表。因此,只要元素具有数字格式,它就可以工作。
    • 我的意思是,我可以立即选择所有键而不是一个一个地检查吗?
    猜你喜欢
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 2011-07-11
    相关资源
    最近更新 更多