2015-01-19 3 views
0

Здравствуйте, у меня есть проблема с моим кодом для проекта, над которым я работаю. В настоящее время я пытаюсь манипулировать словарями и добавлять в них вещи, но с моим кодом происходит что-то странное. Первый шаг к моей функции взять текстовый файл, который выглядит следующим образом:Добавление элементов в словарь

A;X;Y;Z 
B;Y;Z;X 
C;Y;Z;X 
D;Z;X;Y 
E;Z;X;Y 

Я тогда взять строки текста и поместить их в словарь. Пример:

defaultdict(<class 'set'>, {'E': {'Z', 'X', 'Y'}, 'C': {'Y', 'Z', 'X'}, 'A': {'X', 'Y', 'Z'}, 'D': {'Z', 'X', 'Y'}, 'B': {'Y', 'Z', 'X'}}) 

Я написал цикл, чтобы сделать это, но проблема у меня в том, что при добавлении элементов словаря код путает значения в словаре по какой-то причине.

def read_voter_preferences(file : open): 
    votes_dict = defaultdict(set) 
    for line in file: 
     line = line.strip().split(";") 
     for i in range(1,4): 
      print(votes_dict) 
      votes_dict[line[0]].add(line[i]) 
    return votes_dict 

Выход заключается в следующем: defaultdict(<class 'set'>, {'E': {'X', 'Y', 'Z'}, 'C': {'X', 'Y', 'Z'}, 'A': {'X', 'Y', 'Z'}, 'D': {'X', 'Y', 'Z'}, 'B': {'X', 'Y', 'Z'}})

Когда код добавляет элементы в словарь, он смешивает порядок элементов словаря, который имеет важное значение для данного конкретного проекта. Как это исправить? Производит ли .add() сортировку элементов в списке? Спасибо!

ответ

1

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

votes_dict = dict() 
for line in file: 
    line = line.strip().split(";") 
    votes_dict[line[0]] = line[1:] 
return votes_dict 

Обратите внимание, что вы на самом деле не нужен default_dict здесь.

Если вам нужно как поддерживать порядок и удалить дубликаты, ваша жизнь сложнее, но все же не так уж и страшно; например:

votes_dict = dict() 
for line in file: 
    line = line.strip().split(";") 
    votes_dict[line[0]] = thelist = [] 
    seen = set() 
    for item in line[1:]: 
     if item in seen: continue 
     thelist.append(item) 
     seen.add(item) 
return votes_dict 

Вы могли срезать углы, избегать создания и поддержания seen, и использовать что-то вроде:

votes_dict = dict() 
for line in file: 
    line = line.strip().split(";") 
    votes_dict[line[0]] = thelist = [] 
    for item in line[1:]: 
     if item in thelist: continue 
     thelist.append(item) 
return votes_dict 

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

+0

Я не знал этого о наборах. Спасибо огромное! – user3593892

+0

@ user3593892, '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' –

0

Синтаксис

{'Z', 'X', 'Y'} 

объявляет набор пунктов, где только членство важно, не порядок. Таким образом, Python может свободно изменять порядок элементов при отображении набора.

Чтобы сохранить порядок, используйте список:

['Z', 'X', 'Y'] 
+0

Я не знал этого о наборах. Спасибо огромное! – user3593892

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