#python #list #dictionary
#питон #Список #словарь
Вопрос:
Я хочу создать новый список dict со сравнением массового списка dicts. У меня есть несколько условий для сравнения между dicts. слишком много для цикла и если условие делает мой код слишком медленным. Пожалуйста, дайте мне знать, любое решение, чтобы сделать это быстрее. Спасибо
[
{
document : '001',
name: 'name1',
qty : 1,
item : 'item1',
location : 'location1',
},
{
document : '002',
name: 'name2',
qty : 1,
item : 'item1',
location : 'location1',
},
{
document : '003',
name: 'name3',
qty : 2,
item : 'item2',
location : 'location2',
},
{
document : '004',
name: 'name4',
qty : 1,
item : 'item3',
location : 'location3',
},
{
document : '004',
name: 'name4',
qty : 1,
item : 'item4',
location : 'location3',
},
{
document : '001',
name: 'name1',
qty : 1,
item : 'item5',
location : 'location2',
},
]
Условия
- Один элемент, одно количество
- Один элемент, множественное количество
- Несколько элементов, одно количество
- Несколько элементов, несколько Quentity
- Множественное расположение
ниже приведено то, что я хочу получить из приведенного выше списка.
[
[
{
condition : '05',
document : '001',
name: 'name1',
qty : 1,
item : 'item1',
location : 'location1',
},
{
condition : '05',
document : '001',
name: 'name1',
qty : 1,
item : 'item5',
location : 'location2',
},
],
{
condition : '01',
document : '002',
qty : 1,
item : 'item1',
name: 'name2',
location : 'location1',
},
{
condition : '02',
document : '003',
qty : 2,
item : 'item2',
name: 'name3',
location : 'location2',
},
[
condition : '03',
document : '004',
qty : 1,
item : 'item3',
name: 'name4',
location : 'location3',
},
{
condition : '03',
document : '004',
qty : 1,
item : 'item4',
name: 'name4',
location : 'location3',
},
]
]
newList = []
for row in rawList:
tempList = []
if 'condition' not in row:
idx = [i for i,d in enumerate(rawList) if d["document"] == row['document']]
if len(idx) > 1:
is_multi_qty = max([rawList[i]['qty'] for i,d in enumerate(idx) if rawList[i]['qty'] > 0])
is_multi_item = True if len(list(set([rawList[i]['item'] for i,d in enumerate(idx) if 'item' in rawList[i]]))) > 1 else False
is_multi_location = True if len(list(set([rawList[i]['location'] for i,d in enumerate(idx) if 'location' in rawList[i]]))) > 1 else False
for i in idx:
if is_multi_location:
# condition5
rawList[i]['condition'] = '05'
tempList.append(rawList[i])
continue
# condition2
if (is_multi_qty > 1 and is_multi_item is not True):
rawList[i]['condition'] = '02'
# condition3
elif is_multi_qty == 1 and is_multi_item:
rawList[i]['condition'] = '03'
# condition4
elif is_multi_qty > 1 and is_multi_item:
rawList[i]['condition'] = '04'
tempList.append(rawList[i])
elif len(idx) == 1:
# condition1
row['condition'] = '01'
tempList.append(row)
if len(tempList) > 0:
newList.append(tempList)
Комментарии:
1. Вам лучше изменить свой dict на фрейм данных pandas, обработать его и повторно сохранить как dict.
2. «Множественное местоположение» как вы проверяете это конфетирование?
3. Извините, я просто меняю ключ в условии is_multi_location