python сравнивает несколько диктовок в списке с несколькими условиями

#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',
    },
]
 

Условия

  1. Один элемент, одно количество
  2. Один элемент, множественное количество
  3. Несколько элементов, одно количество
  4. Несколько элементов, несколько Quentity
  5. Множественное расположение

ниже приведено то, что я хочу получить из приведенного выше списка.

 [
    [
        {
            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