2015-06-15 3 views
2

у меня есть два списка в Python, таких как:Поиск элементов в двух списках

List1:

('C2244_LNO70_SARM', '1/1/2', '1/2/8', 'CF164_LUJ70_SAR8', 'Router') 
('C1723_LN270_SARM', '1/1/1', '1/1/8', 'CF164_LUJ70_SAR8', 'Router') 
('CF618_JURI70_SARM', '1/1/1', '1/2/7', 'CF164_LUJ70_SAR8', 'Router') 
('CF618_JURI70_SARM', '1/1/2', '1/1/1', 'CF617_LJ370_SARM', 'Router') 
('C2335_ODR70_SARM', '1/1/2', '1/1/2', 'CF693_LAC70_SARM', 'Router') 

list2:

('CF618_JURI70_SARM') 
('C2335_ODR70_SARM') 
('CF617_LJ370_SARM') 

Теперь я хочу идти по List1 в такой что если значения столбца0 или столбца3 не существуют в List2, то эта запись должна быть удалена.

Например, в List1(4,3), значение CF693_LAC70_SARM не существует в List2. Затем строка 4 может быть удалена из списка1.

Каков наилучший способ сделать это? Я попробовал вложенности два for -loops с if-else условиях, но я не могу достичь его ...

Любой намек ценится ...

Lucas

+1

В вашем примере, что будет удалено и что останется? Если несогласованный столбец0 или столбец3 означает, что эта запись удалена, останется только элемент «CF618 ... CF617». – TigerhawkT3

+0

Привет @ TigerhawkT3, да, действительно, если какое-либо из значений в col0 или col3 не соответствует ни одному из элементов в List2, эта строка должна быть удалена из List1. Итак, в моем примере из списка 1 останется только строка3 'CF618 ... CF617'. –

+0

@LucasAimaretto у вас есть * значения column0 или column3 не существуют *, это означает, что если оба не существуют, удалите кортеж? –

ответ

1

С этими list с:

List1 = [('C2244_LNO70_SARM', '1/1/2', '1/2/8', 'CF164_LUJ70_SAR8', 'Router'), 
('C1723_LN270_SARM', '1/1/1', '1/1/8', 'CF164_LUJ70_SAR8', 'Router'), 
('CF618_JURI70_SARM', '1/1/1', '1/2/7', 'CF164_LUJ70_SAR8', 'Router'), 
('CF618_JURI70_SARM', '1/1/2', '1/1/1', 'CF617_LJ370_SARM', 'Router'), 
('C2335_ODR70_SARM', '1/1/2', '1/1/2', 'CF693_LAC70_SARM', 'Router')] 
List2 = [('CF618_JURI70_SARM'), 
('C2335_ODR70_SARM'), 
('CF617_LJ370_SARM')] 

Вы можете использовать оператор in, чтобы отфильтровать нежелательные результаты:

filtered_list = [item for item in List1 if item[0] in List2 and item[3] in List2] 

Или set операции:

List2s = set(List2) 
filtered_list = [item for item in List1 if len({item[0], item[3]} & List2s) == 2] 

В любом случае, , это оставляет нам:

>>> print(*filtered_list, sep='\n') 
('CF618_JURI70_SARM', '1/1/2', '1/1/1', 'CF617_LJ370_SARM', 'Router') 
+0

Спасибо, @ TigerhawkT3. Решение с оператором 'in' работало как шарм! С уважением! –

3

Используйте set хранить все строки из кортежей песни2 и проверить, либо подэлемент из каждого кортежа в наборе:

l1=[('C2244_LNO70_SARM', '1/1/2', '1/2/8', 'CF164_LUJ70_SAR8', 'Router'), 
('C1723_LN270_SARM', '1/1/1', '1/1/8', 'CF164_LUJ70_SAR8', 'Route'), 
('CF618_JURI70_SARM', '1/1/1', '1/2/7', 'CF164_LUJ70_SAR8', 'Router'), 
('CF618_JURI70_SARM', '1/1/2', '1/1/1', 'CF617_LJ370_SARM', 'Router'), 
('C2335_ODR70_SARM', '1/1/2', '1/1/2', 'CF693_LAC70_SARM', 'Router')] 

l2 = [('CF618_JURI70_SARM',), 
('C2335_ODR70_SARM',), 
('CF617_LJ370_SARM',)] 

st = {t[0] for t in l2 } 

# update original list 
l1[:] = [t for t in l1 if t[0] in st or t[3] in st] 

print(l1) 

Выход:

[('CF618_JURI70_SARM', '1/1/1', '1/2/7', 'CF164_LUJ70_SAR8', 'Router'), ('CF618_JURI70_SARM', '1/1/2', '1/1/1', 'CF617_LJ370_SARM', 'Router'), ('C2335_ODR70_SARM', '1/1/2', '1/1/2', 'CF693_LAC70_SARM', 'Router')] 

Предполагаю, что вы имеете в виду индекс 0 и индекс 3, которые являются первым и четвертым столбцами.

Если оба Эле 0 и Эле 3 должны существовать затем использовать и:

l1[:] = [t for t in l1 if t[0] in st and t[3] in st] 

, который оставил бы один кортеж, который является четвёртым:

[('CF618_JURI70_SARM', '1/1/2', '1/1/1', 'CF617_LJ370_SARM', 'Router')] 

Вы также можете использовать set.issuperset которые проверяет, находится ли каждый элемент в t в s:

l1[:] = [t for t in l1 if st.issuperset([t[0],t[3]])] 

print((l1)) 

Что снова будет оставить только один кортеж:

[('CF618_JURI70_SARM', '1/1/2', '1/1/1', 'CF617_LJ370_SARM', 'Router')] 

После того, как ваши данные любого разумного размера стоимость строительства набора будет компенсирована эффективными 0(1) поиска, которые набор обеспечивает таким образом ваш код будет 0(n) в противоположности для квадратичного использования списков.

+0

@ Kasra, я думаю, что это все одиночные кортежи, поэтому нам нужно получить строки изнутри. –

+0

Спасибо, @Padraic, решение с оператором 'in' работало очень хорошо !! –

+1

@ LucasAimaretto, не беспокойтесь, используя списки, означает, что ваш код квадратичен, поэтому для больших входов будет менее эффективным, issuperset также будет работать –

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