【问题标题】:Ignoring some key,value pairs before saving dictionary to CSV在将字典保存到 CSV 之前忽略一些键值对
【发布时间】:2016-01-21 07:17:15
【问题描述】:

我是 Python 新手(2 周),遇到了一个问题。
我有这本不断增长的字典:

dict1={"some_large_key1":"value1","some_large_key2":"value2",........,"some_large_key1000":"value1000"}

问题 1:我想创建一个 csv 文件,我不想在其中包含一些键值对。
--> 一种可能的解决方案是制作一个键列表并忽略整个列表。

list1=["some_large_key1","some_large_key2","some_large_key3"]
for key,value in dict1:
    if key not in list1:         #something like this
        #do something
    else:
        #do something

问题2:我不想给出这么大的键名,我可以直接给出:

list1=["key1","key2",...]

这是一个正确的方法还是我应该考虑别的?

【问题讨论】:

  • 我建议使用集合而不是列表,因为 in 运算符在集合中是常量。但是,是的,你肯定需要那个 if 语句来过滤掉你不想打印的值。
  • 你能详细说明你的“some_large_key1”和“key1”之间的关系吗?您是使用一些函数将“some_large_key1”缩减为“key1”还是直接忽略前几个字符?
  • @dazedconfused :所以我有这个键名:“some_large_key1”。我不想使用这个更大的名称,而是想通过在忽略列表中传递“key1”来使其变得简单。所以在迭代字典时,如果我发现任何包含“key1”的键,比如“blah_blah_key1”,我会忽略它。

标签: python list python-2.7 csv dictionary


【解决方案1】:

是的,您可以列出要忽略的键。

dict1={"some_large_key1":"value1","some_large_key2":"value2","some_large_key3":"value3"}
ignore_list=['key1', 'key2']
new_dict = {}
for key in dict1:
    if not any(x in key for x in ignore_list):
        key_list=[key]
        value_list=[dict1[key]]
        #make a new dict from above 2 lists  (This will exclude ignore key,value pair)
        for i in range(len(key_list)):
            new_dict[key_list[i]] = value_list[i]
print new_dict

输出:

{'some_new_key3':'value3'}  #Note that key1,key2 is ignored in this output dictionary.  

【讨论】:

  • 我建议不要使用range(len(key_list));作为 PyCon 2013 中的 Python 核心开发人员 Raymond Hettinger said每当您发现自己在集合中操作索引时,您都可能做错了。
  • @dazedconfused :感谢您的评论。您的答案更加清晰易懂。我在你的回答中学到了一些东西,所以 +1。
【解决方案2】:

你的“some_large_key1”和“key1”的关系不是很清楚;但是,我认为您可以执行以下操作:

original_dict = {
    "some_large_key1": "value1", 
    "some_large_key2": "value2", 
    ......, 
    "some_large_key1000": "value1000"
}
to_ignore = ['key1', 'key2', 'key3', ...]
filtered_dict = {key: value for (key, value) in original_dict.items() if key.rsplit('_', 1)[-1] not in to_ignore}

key.rsplit('_', 1)[-1] 所做的是它删除了 some_large_ 前缀;您可以将此部分替换为将长键名称转换为较短名称的功能。

【讨论】:

  • 抱歉问题不清楚。这是我在stackoverflow中的第一个问题。我正在努力改进。 :)
猜你喜欢
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 2021-03-27
  • 2021-05-08
相关资源
最近更新 更多