2010-10-05 2 views
9

У меня есть несколько длинных списков в python и они сравнивают их и находят списки, которые равны друг другу, за исключением последних элементов в них. Какой самый быстрый способ?Сравнение списков Python

+0

Вы хотите исключить последний элемент каждого списка или найти общие префиксы? –

ответ

8

Используйте что-то наподобие if list1[:-1] == list2[:-1].

14

a[:-1] является сокращением для «всех элементов a, но последний». Если вам нужно исключить более одного элемента, измените значение 1 на нужный вам номер.

a[:-1] == b[:-1] будет сравнивать a и b без их окончательных элементов.

См. this для получения дополнительной информации о разрезе.

1

Чтобы сравнить два списка, я думаю, что-то вроде этого бы избежать копирования любой части вашего списка, и останавливается, как только обнаружится несовпадение:

len(a)==len(b) and all(a[i] == b[i] for i in range(len(a)-1)) 

Чтобы найти все матчи в произвольном множестве списков , Я думаю, вам нужно сравнить каждую пару списков - или, по крайней мере, каждую пару, в которой вы не проверяли какую-либо эквивалентную версию (например, если A = B и B = C, вам не нужно проверять А = С). Я не знаю из-за алгоритма, который делает это простым.

В качестве альтернативы, если списки возмутительно длинны, и вы хотите избежать их перемещения, вы могли бы вычислить контрольную сумму первых элементов N-1 каждого, а затем просто сравнить контрольные суммы.

+1

Как вычислить контрольную сумму, чтобы избежать прохождения списков? – nmichaels

+0

Если вам нужно сравнить каждый список со всеми остальными, вы смотрите на проходы N * (N-1)/2. Если вы вычисляете хэши для каждого, у вас есть только N обходов исходных списков. В зависимости от того, сколько списков «несколько» есть и как долго «длинные списки», это может избежать большого количества переходов! В любом случае, контрольная сумма достаточно хороша. – Ken

+0

Этот ответ может потенциально сравнить каждый элемент в списке с другой той же длиной - не все, кроме последнего элемента, поэтому он не затрагивает вопрос. – martineau

Смежные вопросы