Здравствуйте!
a = [(['192.168.0.1'], ['8080']), (['192.168.0.2'], ['4662']), (['192.168.0.3'], ['8080', '4662']), (['192.168.0.4'], ['8080', '4662']), (['192.168.0.5'], ['8080', '4662']), (['192.168.0.6'], ['8080']), (['192.168.0.8'], ['80', '443'])]
Почему вот так работает: for key,val in a: d[key[0]] = val
А вот так не работает: [(d[key[0]] = val) for key,val in a]
File "<stdin>", line 1 [(d[key[0]] = val) for key,val in a] ^ SyntaxError: invalid syntax
Может как-то это можно записать короче/красивше?
И почему [a.remove(item) for item in a if '8080' in item[1]]
удаляет не все значения за раз? То есть надо несколько раз выполнить выражение, чтоб удалить все совпадения.
И ещё самый важный вопрос: Подскажите пожалуйста самый правильный метод работы с данными в python типа key:value (как в примере выше, но очень много), чтоб потом можно было производить поиск как по key, так и по value и найденную пару удалять? В данный момент у меня лист туплов с листами (как в примере выше), но оно мне по виду не нравится и я решил перевести это всё в словарь, но как пишут в интернетах — словари для этого не предназначены.
По поводу вопроса, который вы задали в комментарии к ответу от Alex Krass.
Если я правильно понял, вам нужен фильтр, который будет проверять, что хотя бы один номер порта из шаблона содержится в номерах порта в элементах основного списка.
В этом случае, вам нужно вот это:
fl = ['8080', '4662'] a = [(['192.168.0.1'], ['8080']), (['192.168.0.2'], ['4662']), (['192.168.0.3'], ['8080', '4662']), (['192.168.0.4'], ['8080', '4662']), (['192.168.0.5'], ['8080', '4662']), (['192.168.0.6'], ['8080']), (['192.168.0.8'], ['80', '443'])] result = filter(lambda x: (any([f in x[1] for f in fl])), a) print(list(result))
Использование списочного выражение [val for val in key]
подразумевает получение значения в список. Выражение (d[key[0]] = val)
ничего не возвращает и потому в список ничего не уходит. Отсюда и ошибка, все равно что написать print (a = 1)
.
Помимо этого не понятно, что вы хотите получить. Ведь для получения значений достаточно написать просто val
, а для получения ключей есть функция keys()
. В любом случае не стоит зацикливаться на том, что бы код всегда был короче, это одна из ошибок кодирования. Лучше пускай он будет понятнее и быстрее, но не короче.
Если вы удаляете значение из коллекции, то его внутренний счетчик перестраивается и вы получаете неверное значение. Ну для примера:
a = ["one", "two", "three", "four"] for val in a: if val == "three": a.remove(val) print(val)
Как только цикл получит третий элемент, он его удалит и четвертый станет на место третьего. Теперь их там три. Но цикл об этом ничего не знает не будет еще раз получать новый третий элемент, он его пропустит и попытается получить четвертый, которого уже не существует.
Так же и тут, перестройка счетчика не дает Вам получить корректный результат в цикле. Поэтому получайте ссылки и потом удаляйте уже отдельно элементы.
Для больших объемов данных типа key-value мне на ум приходят только БД, но не знаю как они относятся к вашей задаче. Поэтому в данном вопросе ничем не помогу.