将密钥复制到新字典(Python)

时间:2011-09-10 02:33:23

标签: python dictionary

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

但我正在尝试考虑数据可能与我预期不同的行。在那种情况下(我正在捕获一个ValueError异常),我希望那些“可疑”的行进入一个单独的字典,进行手动处理。

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

我一直在玩dict.fromkeys()这样一段时间了,而我现在还没到任何地方。 HALP!

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

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是必需的

3 个答案:

答案 0 :(得分:16)

你很亲密。尝试:

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])

答案 1 :(得分:4)

你试过了吗?

newd = dict.fromkeys(origdict)

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

答案 2 :(得分:0)

您不希望将“只是密钥”复制到另一个字典中,但如果您只有“密钥”,则会有设置

要从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