2015-01-21 2 views
-1

Мой код ниже открывает csv и помещает его в словари с столбцами, являющимися списками. Есть дубликаты ключей, которые не могут измениться. Ключевым является столбец номера счета, который является строкой [1]. Прямо сейчас, если строка «CITY» найдена в строке [8], этот ключ и значение будут удалены. Как написать это, чтобы все другие экземпляры того же ключа (и соответствующих значений) также были удалены?Python Dictionary Pop

with open('c:\\file.csv', 'rb') as f: 
    reader = csv.reader(f) 
    result = collections.defaultdict(list) 
    for row in reader: 
     key = row[1] 
     result[key].append([row[0], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12]]) 

     if 'CITY' in row[8]: 
      result.pop(key) 

Вот входной пример:

3929, 56794, 5555551212, August, IL, 62305, Steve, Johnson, City, Max, Folder, 22, 56 
3929, 56794, 5555551212, August, IL, 62305, Steve, Johnson, None, Max, Folder, 22, 85 
3929, 58586, 5555551212, August, IL, 62305, Steve, Johnson, None, Max, Folder, 22, 69 

Вот результат я хотел бы:

3929, 58586, 5555551212, August, IL, 62305, Steve, Johnson, None, Max, Folder, 22, 69 

Так с «Сити» находится в первом ряду, оба из строки с номером учетной записи 56794 будут удалены.

+0

Существует не такая вещь, как словарь с «дублирующими ключами». Если вы не хотите, чтобы эта конкретная строка была включена, почему бы вам просто не выполнить этот тест 'if' раньше, а не добавлять, если присутствует CITY? – BrenBarn

+0

Извините, каждая строка в csv становится словарем. Затем некоторые из нескольких слов из нескольких словарей являются дубликатами. Если раньше я делаю тест «если», он только избавится от строки, содержащей строку «CITY». Мне нужно избавиться от этой строки и всех других строк, которые затем содержат тот же номер учетной записи. – Christopher

+1

Ваш код не показывает, что каждая строка становится словарем. Он показывает один словарь, в котором один элемент из каждой строки используется как ключ, и все записи с этим ключом, накапливающимся в список. Ваш код действительно удалит все элементы, которые разделяют этот ключ, но если есть другие более поздние строки с этим ключом, они не будут удалены, потому что их еще нет в то время, когда вы их удаляете. Было бы полезно, если бы вы могли включить выборочные данные с ожидаемым выходом. – BrenBarn

ответ

1

Если вы правильно поняли, что хотите удалить ключ, если какой-либо из его строк содержит «ГОРОД» в позиции 8. В этом случае, я думаю, вам может быть лучше отслеживать эти «нежелательные» ключи отдельно , что-то вроде этого:

with open('c:\\file.csv', 'rb') as f: 
    reader = csv.reader(f) 
    result = collections.defaultdict(list) 
    unwantedKeys = set() 
    for row in reader: 
     key = row[1] 
     if 'CITY' in row[8]: 
      unwantedKeys.add(key) 
      if key in result: 
       result.pop(key) 
     if key not in unwantedKeys: 
      result[key].append([row[0], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12]]) 

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