Не существует общего питонического решения, которое бы разделяло список на основе некоторого условия, не говоря уже о том, чтобы выполнять еще более сложную работу по разбиению словаря на основе некоторого условия (например, типа значения, соответствующего определенному типу).
Выполнение того, что вы делаете, является довольно читабельным и неплохим решением, но если вы столкнетесь с этой проблемой чаще, вы можете просто написать функцию, которую затем сможете применить к словарям в списке:
def pdict(d, condition):
"""
Partition a dictionary based on some condition function
:param d: a dict
:param condition: a function with parameters k, v returning a bool for k: v in d
:return: two dictionaries, with the contents of d, split according to condition
"""
return {
k: v for k, v in d.items() if condition(k, v)
}, {
k: v for k, v in d.items() if not condition(k, v)
}
original = [{'a': 1, 'b': 'two', 'c': 3}, {'a': 'one', 'b': 2}, {'a': 1, 'b': 2}]
int_result, nonint_result = [
list(t) for t in zip(*[
pdict(d, lambda k, v: isinstance(v, int)) for d in original
])
]
print(int_result)
print(nonint_result)
Это чисто и позволяет просто повторно использовать partition_dict
для аналогичных случаев.
Вывод, полученный в примере:
[{'a': 1, 'c': 3}, {'b': 2}, {'a': 1, 'b': 2}]
[{'b': 'two'}, {'a': 'one'}, {}]
Более простой пример) используя pdict()
:
d = {1: 42, 2: 33, 3: 5, 4: 10}
odd, even = pdict(d, lambda k, v: v % 2 == 1)
print(odd, even)
Вывод:
{2: 33, 3: 5} {1: 42, 4: 10}
Перезапись pdict()
, которая повторяется только один раз (как предложено @blues), но немного сложнее:
def pdict(d, condition):
"""
Partition a dictionary based on some condition function
:param d: a dict
:param condition: a function with parameters k, v returning a bool for k: v in d
:return: two dictionaries, with the contents of d, split according to condition
"""
meets_condition = {}
does_not_meet_condition = {}
for k, v in d.items():
if condition(k, v):
meets_condition[k] = v
else:
does_not_meet_condition[k] = v
return meets_condition, does_not_meet_condition
Недостатком этого может быть то, что для каждого элемента, добавляемого в словари, могут быть некоторые издержки при поиске, которых исходный пример кода может избежать при понимании словаря.Вы можете запустить тесты производительности, чтобы решить, что является предпочтительным, но последнее решение избегает повторения всего исходного словаря дважды.Я думаю, что предпочел бы первое решение для всего, что не слишком много.