Я предлагаю использовать QueryPath для синтаксического разбора XML и HTML в PHP. В основном это тот же синтаксис, что и jQuery, только на стороне сервера.
Как уже упоминали другие, сканирование списка не только неэффективно, но и 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()
Если вы сделаете свой 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)