Python 2.7: При преобразовании списка в dict в файле dict отсутствует пара значений ключа. Зачем? [Дубликат]

  <input type="text" name="num1" id="num1" onkeyup="sum()">
  <input type="text" name="num2" id="num2" onkeyup="sum()">
  <input type="text" name="num2" id="result">

  <script>
     function sum()
     {

        var number1 = document.getElementById('num1').value;
        var number2 = document.getElementById('num2').value;

        if (number1 == '') {
           number1 = 0
           var num3 = parseInt(number1) + parseInt(number2);
           document.getElementById('result').value = num3;
        }
        else if(number2 == '')
        {
           number2 = 0;
           var num3 = parseInt(number1) + parseInt(number2);
           document.getElementById('result').value = num3;
        }
        else
        {
           var num3 = parseInt(number1) + parseInt(number2);
           document.getElementById('result').value = num3;
        }

     }
  </script>
35
задан Peter G. 19 May 2012 в 14:01
поделиться

6 ответов

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

Итак, вы можете выполнить следующие шаги:

  1. Посмотрите, (вашего начального набора) в окончательный dict. Если это так, перейдите к шагу 3
  2. Обновить dict с помощью клавиши
  3. Добавить к dict [key] в списке новое значение
  4. Повторить [1-3]
6
ответ дан DonCallisto 21 August 2018 в 02:03
поделиться

Словари Python не поддерживают дубликаты ключей. Один из способов - хранить списки или наборы внутри словаря.

Одним из простых способов достижения этого является использование defaultdict :

from collections import defaultdict

data_dict = defaultdict(list)

Все, что вам нужно сделать, это заменить

data_dict[regNumber] = details

на

data_dict[regNumber].append(details)

, и вы получите словарь списков.

84
ответ дан NPE 21 August 2018 в 02:03
поделиться
  • 1
    +1 Хороший способ сделать это, я не буду писать больше строки кода об этом после прочтения этого :) – DonCallisto 19 May 2012 в 12:55
  • 2
    +1 У меня была очень жуткая структура данных, написанная мной. Несмотря на то, что ваш подход сохраняет мою структуру данных жуткой! Но намного меньше: D – user1252280 29 August 2014 в 23:11
  • 3
    Это действительно приятно. Спасибо за идею. – Rick Teachey 13 January 2015 в 19:51
  • 4
    Сначала я не понял, что это эквивалентно объявлению значения словарного слова как списка и его добавлению. Устраняет несколько строк шаблона, хотя это хорошо. if not my_key in data_dict: data_dict[my_key] = list() – ThorSummoner 30 April 2015 в 23:03

Вы не можете дублировать ключи в словаре. Как насчет списка списков?

for line in data_list:
  regNumber = line[0]
  name = line[1]
  phoneExtn = line[2]
  carpark = line[3].strip()
  details = (name,phoneExtn,carpark)
  if not data_dict.has_key(regNumber):
    data_dict[regNumber] = [details]
  else:
    data_dict[regNumber].append(details)
1
ответ дан Oskarbi 21 August 2018 в 02:03
поделиться
  • 1
    Но решение defaultdict лучше, чем делать это вручную (ответ aix) – Oskarbi 19 May 2012 в 12:57
  • 2
    Я это прекрасно работаю. благодаря – nrj 19 May 2012 в 13:01
  • 3
    вместо hash_key, мы можем просто использовать if not regNumber in data_dict – Niklas B. 19 May 2012 в 13:34
  • 4
    Да, not in лучше, и действительно нет метода hash_key в Python 3.x. Благодаря! – Oskarbi 19 May 2012 в 13:45
  • 5
    Вы имеете в виду has_key, а не hash_key. – yak 19 May 2012 в 14:44

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

class Dictlist(dict):
    def __setitem__(self, key, value):
        try:
            self[key]
        except KeyError:
            super(Dictlist, self).__setitem__(key, [])
        self[key].append(value)

Пример вывода:

>>> d = dictlist.Dictlist()
>>> d['test'] = 1
>>> d['test'] = 2
>>> d['test'] = 3
>>> d
{'test': [1, 2, 3]}
>>> d['other'] = 100
>>> d
{'test': [1, 2, 3], 'other': [100]}
29
ответ дан Scorpil 21 August 2018 в 02:03
поделиться
  • 1
    Почему не только if key not in self: вместо try: / except KeyError:? – Kirill Bulygin 3 January 2017 в 19:51
  • 2
    Это не то же самое, что: 'from collections import defaultdict d = defaultdict (list) d [' test ']. Append (1) d [' test ']. Append (2) d [' test ']. Append (3 ) «Или я могу что-то упустить? – Kane Chew 28 October 2017 в 21:01

Если вы хотите иметь списки только тогда, когда они необходимы, и значения в любых других случаях, то вы можете DOthis:

class DictList(dict):
    def __setitem__(self, key, value):
        try:
            # Assumes there is a list on the key
            self[key].append(value) 
        except KeyError: # if fails because there is no key
            super(DictList, self).__setitem__(key, value)
        except AttributeError: # if fails because it is not a list
            super(DictList, self).__setitem__(key, [self[key], value])

Затем вы можете сделать следующее:

dl = DictList()
dl['a']  = 1
dl['b']  = 2
dl['b'] = 3

Что будет хранить следующее {'a': 1, 'b': [2, 3]}.


Я использую эту реализацию, когда хочу иметь обратные / обратные словари, и в этом случае я просто делаю:

my_dict = {1: 'a', 2: 'b', 3: 'b'}
rev = DictList()
for k, v in my_dict.items():
    rev_med[v] = k

Что будет генерировать тот же вывод, что и выше: {'a': 1, 'b': [2, 3]}.


CAVEAT: Эта реализация основана на несуществующем методе append (в значениях, которые вы хранятся). Это может привести к непредвиденным результатам, если значения, которые вы храните, являются списками. Например,

dl = DictList()
dl['a']  = 1
dl['b']  = [2]
dl['b'] = 3

выдаст тот же результат, что и раньше {'a': 1, 'b': [2, 3]}, но можно было ожидать следующее: {'a': 1, 'b': [[2], 3]}.

0
ответ дан toto_tico 21 August 2018 в 02:03
поделиться
0
ответ дан xiansweety 31 October 2018 в 21:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: