Вы можете использовать упорядоченный словарь со значениями по умолчанию set
. 1 sup> Затем итерируйте свой список словарей, используя (number, favorite)
в качестве ключей. Это работает, так как кортежи являются хэшируемыми и поэтому могут использоваться в качестве ключей словаря.
Хорошей практикой является использование последовательной структуры. Таким образом, вместо того, чтобы иметь строки для отдельных значений и наборы для нескольких, используйте наборы повсюду:
from collections import OrderedDict, defaultdict
class DefaultOrderedDict(OrderedDict):
def __missing__(self, k):
self[k] = set()
return self[k]
d = DefaultOrderedDict() # Python 3.7+: d = defaultdict(set)
for i in lst:
d[(i['number'], i['favorite'])].add(i['color'])
res = [{'number': num, 'favorite': fav, 'color': col} for (num, fav), col in d.items()]
print(res)
# [{'color': {'green', 'red'}, 'favorite': False, 'number': 1},
# {'color': {'red'}, 'favorite': True, 'number': 1},
# {'color': {'red'}, 'favorite': False, 'number': 2}]
Если вы настаиваете на наличии разных типов в зависимости от количества цветов, вы можете переопределить понимание списка, чтобы использовать троичный оператор:
res = [{'number': num, 'favorite': fav, 'color': next(iter(col)) if len(col) == 1 else col} \
for (num, fav), col in d.items()]
print(res)
# [{'color': {'green', 'red'}, 'favorite': False, 'number': 1},
# {'color': 'red', 'favorite': True, 'number': 1},
# {'color': 'red', 'favorite': False, 'number': 2}]
1 sup> Этот момент заслуживает внимания в версиях Python до 3.7, где словари не гарантированно упорядочены по вставке. В Python 3.7+ вы можете воспользоваться порядком вставки и просто использовать dict
или подкласс dict
, например collections.defaultdict
.
Я полагаю, что Триггерный набор управления только в настоящее время поддерживает EventTriggers. Если требуется использовать DataTrigger, просто помещают его в стиле, для примера:
<TabItem Header="Blah">
<TabItem.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding BlahType}" Value="0">
<Setter Property="TabItem.Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</TabItem.Style>
</TabItem>
Ну, Вы не можете сделать того использования триггеры (не, если Вы не в DataTemplate, ControlTemplate или Стиле).
Можно сделать это с помощью привязки, необходимо будет записать пользовательский ValueConverter, который переведет между 0/1 в Видимый/скрытый, и затем можно связать свойство Visibility со свойством BlhaType.
Или можно просто установить Видимость в коде и разочароваться в XAML базирующийся подход (это, что я сделал бы).