Решением в чистом Python было бы использование defaultdict
с составным ключом. Вы можете использовать это, чтобы объединить ваши ценности. После этого вы можете снова создать список из этого словаря.
from collections import defaultdict
dct = defaultdict([])
for entry in lst:
dct[(entry['number'], entry['favorite'])].append(entry['color'])
lst = [{'number': key[0], 'favorite': key[1], color: value if len(value) > 1 else value[0]}
for key, value in dct.items()]
Вы корректны. Нет никакого преимущества в использовании КАК ТО, если Вы не делаете подстановочное соответствие. Кроме того, использование его без подстановочного знака могло привести к использованию неэффективного queryplan.
Если никакие подстановочные знаки не используются, то различие, это "=" делает точное совпадение, но КАК будет соответствовать строке конечным пробелам (от SSBO):
При выполнении сравнений строк с ПОДОБНЫМ все символы в строке образца являются значительными, включая продвижение или конечные пробелы. Если сравнение в запросе должно возвратить все строки со строкой КАК 'abc' (abc, сопровождаемая одиночным пробелом), строка, в которой значение того столбца является abc (abc без пространства) не возвращается. Однако конечные пробелы, в выражении, к которому подобран шаблон, проигнорированы. Если сравнение в запросе должно возвратить все строки со строкой КАК 'abc' (abc без пространства), все строки, которые запускаются с abc и имеют нуль, или возвращается больше конечных пробелов.
Солнечный почти разобрался в нем :)
Выполните следующее в QA в установке по умолчанию SQL2005
select * from sysobjects where name = 'sysbinobjs '
-- returns 1 row
select * from sysobjects where name like 'sysbinobjs '
-- returns 0 rows
Так, КАК не соответствует на конечных пробелах, на стороне плана запросов оба работают почти одинаково, но '=', соединение выполняет крошечный бит лучше.
Дополнительная вещь, которую НЕОБХОДИМО иметь в виду при использовании КАК, состоит в том, чтобы выйти строки правильно.
declare @s varchar(40)
set @s = 'escaped[_]_%'
select 1 where 'escaped[_]_%' like @s
--Return nothing = BAD
set @s = '_e_s_c_a_p_e_d_[___]___%'
select 1 where 'escaped[_]_%' like @s escape '_'
--Returns 1 = GOOD
У общих людей не используют КАК для точного соответствия, потому что проблемы выхода вызывают все виды сложностей и тонких ошибок, люди забывают выходить и существует мир боли.
Но... если Вы хотите реальное точное совпадение, которое эффективно, КАК может решить проблему.
Скажите, Вы хотите соответствовать имени пользователя к "sam" и не хотите получать "Sam" или "Sam", и к сожалению сопоставление столбца нечувствительно к регистру.
Что-то как следующее (с добавленным выходом) является способом пойти.
select * from sysobjects
WHERE name = 'sysbinobjs' and name COLLATE Latin1_General_BIN LIKE 'sysbinobjs'
Причина Вы делаете двойное соответствие, состоит в том, чтобы избежать сканирования таблицы.
Однако....
Я думаю, что varbinary, бросающий прием, менее подвержен ошибкам и легче помнить.
С ПОДОБНЫМ ключевым словом можно соответствовать полю u.username
против указанного шаблона вместо фиксированной "строки".
Если Вы видите это в чужом коде, возможно, они намеревались позволить человеку передавать в строке, которая включала шаблон или подстановочные знаки.
Да - Вы правы - это должно только использоваться для подстановочного соответствия. Это должно использоваться экономно особенно на очень больших таблицах на неиндексируемых полях, поскольку это может замедлить Ваши запросы ПУТЕМ ПУТЬ.
КАК для подстановочного соответствия, где как = (равняется), для точные совпадения.
Я также думаю, что это использовало для полей, которые были каталогизированы ПОЛНОТЕКСТОВЫМИ КАТАЛОГАМИ для сравнений строк ядра.
Да, насколько я знаю, использование как без любых подстановочных знаков совпадает с использованием = оператор. действительно ли Вы уверены, что входной параметр не имеет подстановочных знаков в нем?