повторять словарь по нескольким значениям по ключам в python - PullRequest
1 голос
/ 03 ноября 2011

Я хочу найти наиболее оптимальный способ перебора значений в ключе в python.

У меня есть файл с такой структурой:

17 key1

18 key1

45 ключ2

78 ключ2

87 ключ2

900 ключ3

92 ключ4

т.Мне нужно установить второй столбец в качестве ключа (без повторений) и связать с этим ключом все соответствующие ему значения (первый столбец).

'key1': ['17', '18']

' key2 ': [' 45 ',' 78 ',' 87 ']

' key3 ': [' 900 ']

' key4 ':['92']

До сих пор я делаю это без использования словаря:

for line in file:

           value, key = line.strip().split(None,1)

И затем я могу поместить его в словарь с помощью

 diction.setdefault(key, []).append(value)

поэтому после этого у меня есть хороший словарь, который мне нужен.

Но после этого я должен перечитать файл для изменений.изменения могут происходить в ключах (парах) (добавление / удаление) или только в значении (добавление / удаление). Как проверить, произошло ли изменение по ключам итерации по значениям?

UPD ***: проверка ключей -более или менее понятно:

if diction[key]:

но как перебрать значения внутри ключа?Мне нужно найти разницу, а затем добавить \ удалить это значение \ пару (если последнее значение ключа) из словаря?

Я полагаю, это можно сделать с помощью некоторого iteritem () \ itervalues ​​() или smthngно я не знаком с этим.

Спасибо за помощь.

UPD ***

Спасибо @ Joël.Наконец я использовал 3 чека.сначала добавляются любые ключи:

set_old_dict = set(new_old.keys())
set_new_dict = set(new_dict.keys()) 
intersect = set_new_dict.intersection(set_old_dict)



def added(self):
    return set_new_dict - intersect 
  def removed(self):
    return set_old_dict - intersect

А потом, если я не поймаю или уже обработал эти ситуации, я буду использовать вашу функцию:

 def comp(old_dict, new_dict):
     for key, old_val in old_dict.items():
         new_val = new_dict[key]  
        print 'evolutions for', key
         print 'new content:', [x for x in new_val if x not in old_val]
         print 'removed content:', [x for x in old_val if x not in new_val]

1 Ответ

1 голос
/ 03 ноября 2011

Мой совет: если вам нужно перечитать входной файл, вы также можете пересоздать свой словарь, но это зависит от времени, необходимого для его создания.По вашему запросу, возможно, быстрее проанализировать различия в файле и обновить словарь.

Вы можете взглянуть на модуль difflib, а затем проанализировать различия.Исходя из этого, удаление может быть удалено в словаре, добавление может быть добавлено по мере необходимости.

К сожалению, могу поспорить, что вам будет трудно с его выводом: это должно быть читаемым человеком, а не машиночитаемым, так что может быть лучший ответ.


РЕДАКТИРОВАТЬ Если вы хотите отслеживать изменения между двумя версиями файлов, как написано в вашем комментарии, вы можете сравнить словари,Для ключей у вас уже есть то, что нужно.

Теперь для обновленных значений: если вы уверены, что ваши значения всегда будут списками строк, то вы можете сделать то же самое, что и для сравнения клавиш dict:

>>> def comp(old_dict, new_dict):
...     for key, old_val in old_dict.items():
...         new_val = new_dict[key]  # warning: to be used on keys in both dict
...         print 'evolutions for', key
...         print 'new content:', [x for x in new_val if x not in old_val]
...         print 'removed content:', [x for x in old_val if x not in new_val]

# now testing on a simple example
>>> o = {'key1': ['a', 'b', 'c']}
>>> n = {'key1': ['b', 'c', 'd']}
>>> comp(o, n)
evolutions for key1
new content: ['d']
removed content: ['a']

Предупреждение: эта функция работает, только если new_dict содержит все ключи old_dict, в противном случае создание new_val завершится неудачно.Вы можете легко обойти эту проблему, добавив сравнения клавиш в функцию:

  • ключи в old_dict, которых нет в new_dict, являются удаленными записями;
  • ключи в new_dict, а не в old_dict являются дополнениями.

Пожалуйста, опубликуйте свой результат в своем ответе, чтобы другие могли воспользоваться им.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...