【问题标题】:Copy keys to a new dictionary (Python)将键复制到新字典(Python)
【发布时间】:2011-09-10 02:33:22
【问题描述】:

我正在使用 DictReader() 读取 csv 文件。该函数返回一个字典,其中标题项是键,单元格是值。很酷。

但我正在尝试考虑数据可能与我预期不同的行。在这种情况下(我遇到了 ValueError 异常),我希望将“可疑”的行放入单独的字典中,以进行手动处理。

我的问题是:由于我的第一个字典(DictReader 返回的对象)已正确设置了所有键,我如何将 仅键 复制到我的第二个字典中,即我只想成为可疑行的字典,手动处理?

我一直在玩弄 dict.fromkeys() 之类的东西有一段时间了,但我什么也没有。哈!

编辑:粘贴我的一些错误代码。要去隐藏我的代码的耻辱。不要评判我! ;-)

unsure_rows = dict.fromkeys(dict(csv_reader).keys(), [])
for row in csv_reader:
#   if row['Start Time'] != 'None':
    try:
        if before_date > strptime(row['Start Time'], '%Y-%m-%d %H:%M:%S') > after_date:
            continue
    except ValueError:
        unsure_rows += row

ValueError: 字典更新序列元素#0 的长度为 13; 2 是必需的

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    你很接近。试试:

    dict.fromkeys(my_csv_dict.keys(),[])

    这将使用您从 CSV 文件中解析的相同键初始化一个字典,并且每个键都将映射到一个空列表(我假设您会将可疑行值附加到该列表中)。


    试试这个。 (这里有几个细微的变化都是必要的,比如在开始阅读 CSV 之前不能初始化 unsure_rows。)

    unsure_rows = None
    for row in csv_reader:
    #   if row['Start Time'] != 'None':
        try:
            if before_date > strptime(row['Start Time'], '%Y-%m-%d %H:%M:%S') > after_date:
                continue
        except ValueError:
            if not unsure_rows:
                # Initialize the unsure rows dictionary
                unsure_rows = dict.fromkeys(csv_reader.fieldnames,[])
            for key in unsure_rows:
                unsure_rows[key].append(row[key])
    

    【讨论】:

    • 人力资源部。似乎有类型错误,我已经粘贴了上面有问题的部分代码。
    • 我希望 unsure_rows 也是一个字典,以便我可以轻松引用这些值。
    • 我明白,但您必须进一步澄清。在您当前的代码中,当您引用字典键时,只有一个值要返回,因为您正在处理单行。但是在您的unsure_rows 结构中,单个键将引用[可能] 多行的值。您是否希望每个字典键映射到与该键关联的列的单元格值列表?
    • 哦。是的,我想这正是我想要的!
    • 第一个建议将在字典中的所有键下添加相同的列表。有人会大吃一惊。
    【解决方案2】:

    您不希望将“仅键”复制到另一个字典,但如果您有“仅键”,您将拥有一个 set。 p>

    要从 dict d 获取密钥,您只需说出 d.keys()

    这将返回一个列表(键以任意顺序),您可以将其保留为列表或复制到集合中

    set(d.keys())
    

    例子:

    >>> d = {'one': 1, 'three': 3, 'two': 2, 'four': 4} 
    >>> set(d.keys())
    set(['four', 'one', 'three', 'two'])
    

    编辑

    现在我看到您打算在捕获异常时捕获可疑的键值对。在这种情况下,只需从一个空字典开始

    suspect = {}
    

    在你的代码中,我想这是某种循环,像这样添加可疑的键值对:

    while something():
        k, v = generate_pair()
        try:
            analyze_something_with_k_and_v_that_might_throw_an_exception
            add_it_to_regular_dict
        except:
            suspect[k] = v
    

    【讨论】:

    • 精氨酸。格式错误的问题。当我发现异常时,我想将它们附加到我的第二本字典中。你是对的,这意味着我不想只是复制钥匙,或者有一套。我的思路是字典至少需要有键,以便我以后可以附加值。我错了吗?
    • 哦,我明白了。只需从一个空字典开始,并在检测到可疑键值对时一一添加。我已经更新了答案以显示这一点。
    【解决方案3】:

    你试过了吗:

    newd = dict.fromkeys(origdict)
    

    ?如果这对您不起作用,请添加有关您遇到的错误的更多详细信息。

    【讨论】:

      【解决方案4】:

      由于 dict.fromkeys 正在创建字典,所有值都指向同一个列表,因此来自 Chechen 的解决方案不再有效,您应该改用 {k: [] for k in my_csv_dict.keys()}

      【讨论】:

      • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
      猜你喜欢
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      相关资源
      最近更新 更多