Используя чистый python, вы можете сделать вставку в OrderedDict
, чтобы сохранить порядок вставки:
from collections import OrderedDict
d = OrderedDict()
for l in lst:
d.setdefault((l['number'], l['favorite']), set()).add(l['color'])
[{'number': k[0], 'favorite': k[1], 'color': v.pop() if len(v) == 1 else v}
for k, v in d.items()]
# [{'color': {'green', 'red'}, 'favorite': False, 'number': 1},
# {'color': 'red', 'favorite': True, 'number': 1},
# {'color': 'red', 'favorite': False, 'number': 2}]
Это также можно сделать довольно просто, используя API панд GroupBy
: [116 ]
import pandas as pd
d = (pd.DataFrame(lst)
.groupby(['number', 'favorite'])
.color
.agg(set)
.reset_index()
.to_dict('r'))
d
# [{'color': {'green', 'red'}, 'favorite': False, 'number': 1},
# {'color': {'red'}, 'favorite': True, 'number': 1},
# {'color': {'red'}, 'favorite': False, 'number': 2}]
Если требуется условие строки для одного элемента, вы можете использовать
[{'color': (lambda v: v.pop() if len(v) == 1 else v)(d_.pop('color')), **d_}
for d_ in d]
# [{'color': {'green', 'red'}, 'favorite': False, 'number': 1},
# {'color': 'red', 'favorite': True, 'number': 1},
# {'color': 'red', 'favorite': False, 'number': 2}]
Необходимо взглянуть на класс TMultiReadExclusiveWriteSynchronizer, объявленный в sysutils.pas...
Действительно необходимо посмотреть на TThreadList.
Методы.Add.Remove.Clear автоматически блокируют список для Вас. В случае необходимости можно также блокировать/разблокировать по мере необходимости:
x.LockList;
try
//do whatever
finally
x.Unlocklist;
end;
TMultiReadExclusiveWriteSynchronizer является главной идеей, но я не знаю, сглаживали ли они когда-нибудь все ошибки. Это всегда имело проблемы при загрузке.
Взгляните на это учебное руководство. Поточная обработка Delphi Путь
Взгляд на Главу 11, но это - весь хороший материал.