2016-03-29 3 views
-1
listA = ['abcd754_efgh_20160110_165623.frf', 'abcd754_efghijk_20160110_162419.frf', 'abcd755_mno_20160110_165287.frf', 'abcd755_mnopqr_20160110_164562.frf' ] 
listB = ['abcd754_efgh', 'abcd754_efghijk_', 'abcd755_mno_', 'abcd755_mnopqr_'] 

У меня есть список A и список B. Список A может иногда содержать один или два элемента. На основании этого мне нужно создать список C с элементами в списке B, поддерживая тот же порядок.Элемент соответствия списка на основе другого списка в python, где элементы одного списка являются подстрокой элементов другого списка

Мне не удалось найти решение.

+0

Что касается вопроса, вы можете добавить, что должно выглядеть listC? Кроме того, можете ли вы поставить свою попытку в вопросе, чтобы его было легче читать? – Bahrom

+0

Таким образом, если список A = [ 'abcd754_efgh_20160110_165623.frf', 'abcd754_efghijk_20160110_162419.frf'] список C должен быть [ 'abcd754_efgh', 'abcd754_efghijk_'] – Brad

+0

Тогда что точка 'listA'? – Bahrom

ответ

1

Использование listcomp вы можете сказать:

listC = [b for b in listB if any(b in a for a in listA)] 

Для

listA = ['abcd754_efgh_20160110_165623.frf', 'abcd754_efghijk_20160110_162419.frf', 'abcd755_mno_20160110_165287.frf'] 
listB = ['abcd754_efgh', 'abcd754_efghijk_', 'abcd755_mno_', 'abcd755_mnopqr_'] 

Отпечатано

['abcd754_efgh', 'abcd754_efghijk_', 'abcd755_mno_'] 
+0

Я попробовал решение. Однако, когда он дает выход diff в конкретном сценарии: listB = ['abcd754_efgh, abcd754_efghijk_', 'abcd755_mno_', 'abcd755_mnopqr_'] listA = ['abcd754_efgh_20160110_165623.frf', 'abcd754_efghijk_20160110_162419.frf', 'abcd755_mno_20160110_165287.frf '] Вывод: [' abcd754_efgh, abcd754_efghijk_ ',' abcd755_mnopqr_ '], тогда как это должно быть [' abcd754_efgh, abcd754_efghijk_ ',' abcd755_mno_ '] – Brad

+0

Я просто попробовал, он работает, ваш списокB, однако, отсутствует набор котировок. измените listB на '['abcd754_efgh', 'abcd754_efghijk_', 'abcd755_mno_', 'abcd755_mnopqr _']' – Bahrom

+0

Превосходно! Это работает как шарм @BAH. Огромное спасибо. Я настоящий эдиот! – Brad

1

Вы могли бы сделать что-то вроде этого:

listA = ['abcd754_efgh_20160110_165623.frf', 'abcd754_efghijk_20160110_162419.frf', 'abcd755_mno_20160110_165287.frf'] 
listB = ['abcd754_efgh', 'abcd754_efghijk_', 'abcd755_mno_', 'abcd755_mnopqr_'] 
listC = [] 

for b in listB: 
    if any(a.startswith(b) for a in listA): 
     listC.append(b) 

print listC 

выходы ['abcd754_efgh', 'abcd754_efghijk_', 'abcd755_mno_']

Вы не указали, если вы хотите элементы LISTB, которые являются или не являются в lišta, поэтому добавьте not перед тем any если вы хотите по-другому.

Это простое квадратичное решение, если у вас есть много элементов, вам нужно что-то более эффективное

+0

Выдает ошибку: NameError: name 'abcd754_efgh' не определен И список состоит из 4 элементов. Это не длинный список. – Brad

+0

Список C должен быть '['abcd754_efgh', 'abcd754_efghijk _']' согласно комментариям афера. Я думаю, что ваша логика if отменена - ваш ответ печатает '['abcd755_mno_', 'abcd755_mnopqr _']'. Удалите 'not' в вашем if-блоке. – Bahrom

+0

Я попробовал решение. Однако, когда он дает выход diff в конкретном сценарии: listB = ['abcd754_efgh, abcd754_efghijk_', 'abcd755_mno_', 'abcd755_mnopqr_'] listA = ['abcd754_efgh_20160110_165623.frf', 'abcd754_efghijk_20160110_162419.frf', 'abcd755_mno_20160110_165287.frf' ] Вывод: ['abcd754_efgh, abcd754_efghijk_', 'abcd755_mnopqr_'], тогда как это должно быть ['abcd754_efgh, abcd754_efghijk_', 'abcd755_mno_'] – Brad

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