如何在Python字典值上进行子集化并删除其他值?

时间:2017-02-21 19:09:10

标签: python python-3.x dictionary

在Python3.x中使用Counter(),我创建了一个脚本,它可以计算文本文件中的字符数,然后为每个文件输出一个python字典。

import glob
from collections import Counter

files = glob.glob("*.txt")
for f in files:
    for line in f:
        filename, contents = line.strip().split()
        results[filename] = Counter(line)

这是输出:

{ "textfile1.txt": Counter({'C': 23426, 'T': 5111, ' ': 4231, 'l': 3321, 'G': 353, '4': 2987797, 'R': 2, 'B': 223185, 'r': 186587}) }

键值对的值包括Counter()内的键值对,它显示每个字符的计数器数,例如"character": # of characters

我的问题:鉴于这些值,我如何只选择某些字符,例如仅限CT并删除所有其他人。

我的想法是某种列表理解:

dictionary1 # original dictionary above
correct_keys = ["C", "T"]
corrected_dictionary1 = {k: v for k, v in dictionary1.values().split if values in correct_keys}

这并不是很有效;这是错误:

AttributeError: 'dict_values' object has no attribute 'split'

1 个答案:

答案 0 :(得分:1)

你几乎就在那里,你需要运行第一个dict,他的密钥是文件名,然后通过内部dict运行,最后检查它是否在correct_keys

from collections import Counter
dictionary1 = { "textfile1.txt": Counter({'C': 23426, 'T': 5111, ' ': 4231, 'l': 3321, 'G': 353, '4': 2987797, 'R': 2, 'B': 223185, 'r': 186587}),
                "textfile2.txt": Counter({'C': 23427, 'T': 5112, ' ': 4231, 'l': 3321, 'G': 353, '4': 2987797, 'R': 2, 'B': 223185, 'r': 186587})}
correct_keys = ["C", "T"]

def filter_dict_results(items):
    tmp_dict = [{k : v} for k,v in items if k in correct_keys]
    ret = {}
    for elem in tmp_dict:
        ret.update(elem)
    return [ret]

corrected_dictionary1 = [res_dict for (k, v) in dictionary1.items() for res_dict in filter_dict_results(v.items())]
print corrected_dictionary1

<强>输出:

[{'C': 23426, 'T': 5111}, {'C': 23427, 'T': 5112}]