【问题标题】:Add key/values to dictionary using condition使用条件将键/值添加到字典
【发布时间】:2016-05-15 15:11:26
【问题描述】:

我有一个要添加到下面字典中的项目列表:

COLS = ['CUST', 'MODEL', 'SN', 'DATE', 'CHARGE', 'QTY', 'TOTAL']
with open('UserfeeInvoicing.csv', 'r') as infile:
    ranpak_dict = {
        row[2]: dict(zip(COLS, row)) for row in csv.reader(infile)
    }

是否只添加具有CHARGE =/= 0CHARGE > 0 的记录

【问题讨论】:

  • 你能澄清一下条件吗? CHARGE > 0 已经暗示 CHARGE != 0 - 你的意思是 CHARGE >= 0 吗?
  • @Lisa:我认为它们只是两个例子。

标签: python csv dictionary conditional-statements


【解决方案1】:

您可以执行以下操作:

ranpak_dict = {}
COLS = ['CUST', 'MODEL', 'SN', 'DATE', 'CHARGE', 'QTY', 'TOTAL']

with open('UserfeeInvoicing.csv', 'r') as infile:      

    reader = csv.reader(infile)
    for row in reader:

        if float(row[COLS.index('CHARGE')]) >= 0:
            ranpak_dict[row[2]] = dict(zip(COLS, row))

【讨论】:

    【解决方案2】:

    不要使用csv.reader(),而是使用csv.DictReader() object。该对象使创建字典和过滤行变得更加容易;您的代码重构为使用DictReader(),如下所示:

    COLS = ['CUST', 'MODEL', 'SN', 'DATE', 'CHARGE', 'QTY', 'TOTAL']
    with open('UserfeeInvoicing.csv', 'r') as infile:
        reader = csv.DictReader(infile, fieldnames=COLS)
        ranpak_dict = {row['SN']: row for row in reader}
    

    csv.DictReader() 对象的作用完全与您的dict(zip(COLS, row)) 调用的作用相同;给定一系列字段名,从每一行构建一个字典。

    在列表、字典或集合理解中过滤就像添加额外的循环一样;只需将if <condition> 添加到循环中即可:

    ranpak_dict = {row['SN']: row for row in reader if int(row['CHARGE']) > 0}
    

    注意int() 调用;我假设 CHARGEalways 包含数字。

    如果您的文本字段都被引用,您还可以设置quoting=csv.QUOTE_NONNUMERIC,此时所有不带引号的列都会自动转换为float。这会将代码简化为:

    reader = csv.DictReader(infile, fieldnames=COLS, quoting=csv.QUOTE_NONNUMERIC)
    ranpak_dict = {row['SN']: row for row in reader if row['CHARGE'] > 0}
    

    【讨论】:

    • 我真的很喜欢这个解决方案,并且正在尝试利用它。但是在创建字典时,我遇到了语法错误。在 If 语句之后,它需要一个 Else。
    • @AlliDeacon:不,我错过了 dict 理解中的值表达式;现已更正。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2017-11-15
    • 1970-01-01
    • 2020-05-21
    相关资源
    最近更新 更多