наиболее эффективный метод фильтрации сочетания символьных и числовых данных в Python - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть список заказов с заголовками (ID, процесс, материал, отделка) и набором машин.У него есть заголовки (ID, процесс, материалы, отделка).Для каждого заказа я хочу найти совместимые машины.

Я могу создать список списка, содержащий заказы и список списка, содержащий машины, и использовать цикл for для завершения этой задачи.Код для того же самого упомянут ниже.Тем не менее, я хочу более эффективный метод, чтобы сделать то же самое.

orders = [[1, 'cutting', 'Al', 200], [2, 'boring', 'Al', 200]]

machines = [[1, 'cutting', ['Steel', 'Al'], [100,200,300]], \
            [2, 'boring', ['titanium', 'PLA', 'ABS'], [100,200]], \
            [3, 'hobbing', ['wood', 'Al', 'SS'], [300,400]]]

match = []
for i in range(len(orders)):
    for j in range(len(machines)):
        if orders[i][1] == machines[j][1] and orders[i][2] in machines[j][2] and \
        orders[i][3] in machines[j][3]:
           match.append([orders[i][0], machines[j][0]])   

print (match)

Я не мог использовать массив numpy, поскольку столбцы материала и разрешения в машинах состоят из списков различной длины, и списки не могут быть элементом массива numpy.Пожалуйста, предложите, что является более эффективным методом для этого.У меня есть сотни заказов и тысячи машин, поэтому этот метод цикла становится крайне неэффективным.

1 Ответ

0 голосов
/ 14 февраля 2019

Для начала мы можем очистить итерацию с помощью:

for order in orders:
    for machine in machines:
        if order[1] == machine[1] and order[2] in machine[2] and \
        order[3] in machine[3]:
           match.append([order[0], machine[0]])   

Это может не иметь большого значения в скорости, но делает вещи более читабельными.

for order in orders:
    for machine in machines:
        if order[1] == machine[1] and \ 
           order[2] in machine[2] and \
           order[3] in machine[3]:
           match.append([order[0], machine[0]]) 

Если machines уникальны для machine[1], это может помочь создать словарь

machine_dict = {machine[1]: [machine[0], machine[2], machine[3]] for machine in machines}

И в цикле:

for order ...
    machine = machine_dict[order[1]]
    # but what if there's a keyerror?
    # the rest of the test

Если есть несколько машин с одинаковым [1]словарь будет более сложным, но все же может быть полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...