Python улучшает обработку списка для большего ввода

Я предлагаю использовать QueryPath для синтаксического разбора XML и HTML в PHP. В основном это тот же синтаксис, что и jQuery, только на стороне сервера.

0
задан sateayam 17 January 2019 в 15:58
поделиться

2 ответа

Как уже упоминали другие, сканирование списка не только неэффективно, но и O (n), поэтому чем больше ваш список, тем хуже время поиска.

Здесь у вас есть два списка сканирования, одно неявное (dev_id in dev_exist) и одно явное (for y in fin_list: if dev_id in y[0]:).

Решение состоит в том, чтобы использовать dict (или collections.OrderedDict, если порядок вставки имеет значение) для сохранения дедуплицированного результата, с «id» в качестве ключа и строкой в ​​качестве значения - поиск ключа Dict равен 0 (1) (постоянный время) и очень быстро. Этот диктант также заменит список dev_exist.

Также, учитывая данные вашего примера, вы, вероятно, захотите заменить if 'somestring' in x[i] на if x[i] == 'somestring', что является более точным ('foo' in 'foobar' вернет истину, вероятно, не то, что вы хотите) и (немного) быстрее (в зависимости от строки длина).

def rm_dupl(my_list):
    results = {} # or `collections.OrderedDict`

    for row in my_list:
        prev_row = results.get(row[0])
        if prev_row:
            # if entry exist, we just update the existing entry with 
            # the value of this current row, and not creating a new entry
            # below we update with the duplication one

            val = row[2] # avoids multiple access to `row[2]`
            if val == 'Broadband':
                prev_row[2] += '_Broadband'
                prev_row[6] = row[6]
            elif val == 'IPTV':
                prev_row[2] += '_IPTV'
                prev_row[7] = row[7]
            elif val == 'Voice':
                prev_row[2] += '_Voice'
                prev_row[8] = row[8]

        else:
            # no matching row found, let's add
            # a new one
            results[dev_id] = row

    # and returns the values
    # NB in py3 you'll want `list(results.values())` instead
    return results.values()
0
ответ дан bruno desthuilliers 17 January 2019 в 15:58
поделиться

Если вы сделаете свой dev_exist набор, проверка наличия значения станет намного быстрее. В настоящее время каждое значение должно пройти через все значения в списке dev_exist, чтобы проверить, присутствует ли оно уже. Однако проверка наличия значения в наборе выполняется с помощью хеширования и будет намного быстрее.

Это позаботится о значительной части времени.

РЕДАКТИРОВАТЬ: Вы также можете заменить список на диктовку при поиске дубликатов. Dicts также обеспечивают быстрые in методы.

my_dict = {}
for val in my_list:
    if val[0] in my_dict:
        print(val[0], "exists already")
        # Your code for replacing an existing entry here
    else:
        my_dict[val[0]] = val[1:]

# To convert back to a list
new_list = []
for key, value in my_dict.items():
    new_list.append([key]+value)
0
ответ дан b9s 17 January 2019 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: