2017-02-21 2 views
0

Используя Counter() с Python3.x, я создал скрипт, который будет подсчитывать количество символов в текстовом файле, а затем выводит словарь python для каждого файла.Как подмножество значений словаря 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.

Мой вопрос: учитывая эти значения, как выбрать только определенные символы, например. только C и T и удалите все остальные.

Моя идея была бы какая-то список понимания:

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' 
+3

Почему вы думаете, что вы можете использовать 'split' здесь? '.split' - это метод' str' ... просто удалите его. Кроме того, 'values' i - имя, которое не определено. Я думаю, вы имеете в виду 'v'. –

+0

@ juanpa.arrivillaga Это, очевидно, ошибка. Я пытаюсь «разбить» значения «dictionary1», которые являются отдельными парами ключ-значение. – ShanZhengYang

+0

... правильно, это то, что вы сделали, когда вы распаковали этот кортеж в 'k, v'. –

ответ

1

Вы были почти там, Вам нужно запустить через первый Словаре, который его ключ является именем файла, а не бежать через внутренний Словаре и в конце концов, проверить, является ли она в 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}] 
+0

Это имеет смысл. Благодаря! Однако это правильно работает, так как словарь 'dictionary1' имеет только одну пару ke-value. Если есть несколько ключей, то он объединяет все результаты вместе. Правильный способ может быть «для элемента в списке (dictionary1.items())», а затем заменить «dictionary1.items()» после оператора for – ShanZhengYang

+0

@ShanZhengYang, вы правы, вам нужно немного усложнять, но я 'обновил код до того, что вам нужно, удачи! –

+0

Спасибо за помощь. Ответ на этот вопрос отвечает, но в интересах обучения: используя свое понимание списка, как мне создать словарь, который включает имя файла? Я могу создать кортеж с именем файла и словарем 'res_dict' с' [(k, res_dict) для (k, v) в словаре1.items() для res_dict в файле filter_dict_results (v.items())] ' – ShanZhengYang

Смежные вопросы