2013-06-05 3 views
0

У меня есть словари с одинаковой длиной. И у меня есть два индекса. Что я должен сделать, это создать новый словарь, как это:Объединить элементы словаря данного индекса в python

  • элементов от 0 до INDEX1 из dictionary1
  • Элементы из INDEX1 в index2 из Dictionary2
  • элементы из index2 длины из словаря 1

Я попытался это:

L = len(dic1) 
result = {} 
ini = random.randint(0,L-1) 
end = random.randint(inici+1,L) 
i = 0 
while i < ini: 
    key = dic1.keys()[i] 
    vaue = dic1.get(key) 
    result[key] = value 
    i += 1 

while i < end: 
    key = dic2.keys()[i] 
    vaue = dic2.get(key) 
    result[key] = value 
    i += 1 

while i < L: 
    key = dic1.keys()[i] 
    vaue = dic1.get(key) 
    result[key] = value 
    i += 1 

return result 

Но когда я исполню несколько итераций что-то не так, потому что иногда длина результата имеет ту же длину, что и dic1 и dic2. Не могли бы вы помочь мне?

Большое спасибо!

+0

Словари не заказываются; в каком порядке вы ожидали '.keys()'? –

+0

Важно, чтобы заказ? Я просто хочу сделать это в порядке элементов в dic1 и dic2 – user2457716

+0

Да, порядок важен. В зависимости от истории вставки и удаления словарей порядок ключей, сохраненных '.keys()', может быть совершенно иным, даже с тем же текущим содержимым. –

ответ

-2

Словари не имеют длины, поскольку они не являются последовательностями. Соответственно, нет естественного определения диапазона ключей, определенных самим dict.

Вы могли бы отсортировать ключи в некотором роде, возможно.

+0

Но когда я выполняю len (dic1), например, он дает мне количество элементов в словаре, не так ли? – user2457716

+2

Словари ** do ** есть длина. Количество ключей в словаре определяет длину словаря. –

+0

@MartijnPieters Это еще не длина. – Marcin

0

вы можете использовать OrderedDict от collections, чтобы сохранить порядок клавиш, но тогда вам нужно будет настроить ключи, чтобы они упорядочивались по своему усмотрению, что не так.

Вы также можете подклассифицировать dict, чтобы создать какой-то мета-dict, который реализует все методы для dict, в то время как содержит ссылки на три dicts и возвращает конкатенацию списков для трех dicts в методе keys(), то близкое к:

class MetaDict(dict): 
    def __init__(self, d1, d2, d3): 
     self.d1 = d1 
     self.d2 = d2 
     self.d3 = d3 

    def keys(self): 
     return self.d1.keys() + self.d2.keys() + self.d3.keys() 

    ... 

конечно вы будете иметь подкласс __getitem__(), __setitem__(), __iter__(), iteritems() и все остальные, чтобы заставить его вести себя как Dict. И тогда вам придется сделать смелый выбор того, как обрабатывать настройки элемента ... Конечно, вы можете избежать подкласса dict() и просто создать класс, который ведет себя как dict и определить только метод, который вы будете используйте впоследствии.

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