Если вы создаете что-то вроде:
CREATE TABLE, ЕСЛИ НЕ СУЩЕСТВУЕТ your_table (id int (7) UNSIGNED NOT NULL AUTO_INCREMENT, имя varchar (256) COLLATE utf8mb4_bin NOT NULL, PRIMARY KEY (id), UNIQUE KEY name (name)) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 AUTO_INCREMENT = 1 ROW_FORMAT = FIXED;
должно быть что-то вроде
CREATE TABLE, если не EXISTS your_table (id int (7) UNSIGNED NOT NULL AUTO_INCREMENT, имя varchar (256) COLLATE utf8mb4_bin NOT NULL, PRIMARY KEY (id)) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 AUTO_INCREMENT = 1 ROW_FORMAT = FIXED;
, но вам нужно проверить уникальность этого столбца из кода или добавить новый столбец в качестве MD5 или SHA1 столбца varchar
У вас не может быть указатель с двойными ключами для определения! Установлено, что вы можете использовать один ключ и, как значение, список элементов, имеющих этот ключ.
Итак, вы можете выполнить следующие шаги:
Словари Python не поддерживают дубликаты ключей. Один из способов - хранить списки или наборы внутри словаря.
Одним из простых способов достижения этого является использование defaultdict
:
from collections import defaultdict
data_dict = defaultdict(list)
Все, что вам нужно сделать, это заменить
data_dict[regNumber] = details
на
data_dict[regNumber].append(details)
, и вы получите словарь списков.
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)
hash_key
, мы можем просто использовать if not regNumber in data_dict
– Niklas B.
19 May 2012 в 13:34
not in
лучше, и действительно нет метода hash_key
в Python 3.x. Благодаря!
– Oskarbi
19 May 2012 в 13:45
Вы можете изменить поведение встроенных типов в 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]}
if key not in self:
вместо try:
/ except KeyError:
?
– Kirill Bulygin
3 January 2017 в 19:51
Если вы хотите иметь списки только тогда, когда они необходимы, и значения в любых других случаях, то вы можете 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]}
.