Вот один из способов сделать это:
Я сначала построил dict
, используя кортеж в качестве составного ключа, а затем составил новый список из этого dict
. Вы можете написать понимание для дальнейшего сокращения строк и оптимизации, надеюсь, это поможет.
new_dict = {}
for item in lst:
try: # if already exists then append to the list
new_dict.get((item['number'], item['favorite']))
new_dict[(item['number'], item['favorite'])].append(item['color'])
except KeyError: # if it doesn't then create a new entry to that key
new_dict[(item['number'], item['favorite'])] = [item['color']]
final_list = []
for k, v in new_dict.items(): # keep appending dicts to our list
final_list.append({'number': k[0], 'favorite': k[1], 'color':set(v)})
print(final_list)
Выходы:
[{'number': 1, 'favorite': False, 'color': {'green', 'red'}}, {'number': 1, 'favorite': True, 'color': {'red'}}, {'number': 2, 'favorite': False, 'color': {'red'}}]
Самый простой путь состоял бы в том, чтобы только поместить всю проверку в обработчик Кнопок отправки, вместо того, чтобы иметь его в средствах управления.
Форма имеет свойство AutoValidate, которое может быть установлено позволить изменение фокуса
у нас есть функция проверки, которая возвращает bool, если форма допустима и устанавливает всех ошибочных поставщиков на форме:
похож на это:
private void OnSave()
{
if(ValidateData())
{
//do save
}
}
public bool ValidateData()
{
errorProvider.Clear();
bool valid = true;
if (this.defectStatusComboBox.SelectedIndex == -1)
{
errorProvider.SetError(defectStatusComboBox, "This is a required feild.");
valid = false;
}
//etc...
return valid;
}
Существует свойство (я думаю, что это находится на форме), который позволяет Вам перемещаться между полями, когда проверка перестала работать. Я не могу помнить то, чем это называют, но я думаю, что это назвало довольно описательно.
The form property is "AutoValidate" and it affects all controls on the form. It's an enum; set it to System.Windows.Forms.AutoValidate.EnableAllowFocusChange to allow user to exit a control which failed validation, but still show the error icon which allows the user to pull up error tooltip.
The control "CausesValidation" property is a boolean. If it's true then the control raises the validation event which triggers the errorProvider. It it's false, everything gets bypassed, user can exit control, but there's no error icon or tooltip.