2013-12-05 4 views
1

Мне сложно найти лучший способ выполнить поиск по 2 спискам. Я изучил много сообщений здесь, которые предлагают использовать такие вещи, как any() или all() или regex ... У меня есть это сейчас, но я использую этот тип поиска много, и я действительно хотел бы сделать это правильно.Поиск элементов списков против других элементов подмножества списков

SearchList = ['blah-1.2.3.tar.gz', 'blah-1.2.4.tar.gz', 'blah-1.2.5.tar.gz'] 
BaseList = ['blah-1.2.3', 'blah-1.2.4'] 

Я хотел бы искать BaseList для '1.2.3', '1.2.4' и '1.2.5' в пункты SearchList. Я использовал цикл for в for, но мне хотелось бы что-то более чистое, которое использовало бы выражение для выражения/генерации списков pythons и any() или какое-то другое решение типа regex.

+0

пожалуйста, напишите ваше текущее решение ... но это звучит, как это лучше всего подходит для codereview.stackexchange.com –

+0

я не хочу моего решения ... Я просил любые предложения, которые не включали решение типа «для внутри». –

+0

Я бы предложил использовать регулярное выражение, чтобы получить сопоставимые строки для поиска и выполнить поиск/сравнить с 'set()' python ' – sphere

ответ

4

Вы можете просто сделать:

[a for a in SearchList if a[:-7] in BaseList] 

The A [: - 7] лишит .tar.gz в конце, остальные основной список понимание. Он вернет список элементов из SearchList, которые соответствуют элементам из BaseList.

+0

Отлично. Есть ли способ захватить то, чего не существует в BaseList? –

+0

Ну а если не трюк –

+0

Я использовал что-то вроде [: - 7], но немного сложнее, поскольку я не всегда знаю бла. Что это называется btw? И где можно найти информацию об этом? –

1

С другой стороны, воспользоваться тем, что str.startswith принимает кортеж аргумент

t = tuple(BaseList) 
[x for x in SearchList if x.startswith(t)] 
+0

Я пробовал [x for x в SearchList, если не x.startswith (tuple (BaseList))], и да, это тоже отлично работает. Это может быть немного (просто ...) медленнее, чем нотация с фрагментами. –

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