у меня есть этот список
list = ['DI', 'CI', 'CS', 'TQ','CE']
и второй список, содержащий строки
list_string = ['dd4/DI/dew', '55t/ft54/CS/rgd/fge', '32g/tt/CE/45/543/g54', '454/533/633/76']
Я хотел бы вернуть список той же длины, что и list_string, с элементом в списке, если он присутствует, если не вернуть «другие», что-то вроде этого
return_list = ['DI', 'CS', 'CE', 'others']
Я пробую этот return_list = [next((t for t в элементе, если список в t), «другие») для элемента в list_string], но предложение «in» в for не учитывает списки
@SimonBenavides, вы можете выбрать имя, отличное от «списка», что может вызвать проблемы, если ваш код нуждается, например, в приведении чего-либо к списку Python.
Следующий код должен делать то, что вы хотите:
list = ['DI', 'CI', 'CS', 'TQ','CE']
list_string = ['dd4/DI/dew', '55t/ft54/CS/rgd/fge', '32g/tt/CE/45/543/g54', '454/533/633/76']
return_list = []
element_exists = False
for element in list:
for word in list_string:
if element in word:
return_list.append(element)
else:
element_exists = False
if element_exists is False:
return_list.append('others')
print(return_list)
Да, я думал об этом, но дело в том, что у меня есть много значений в моем списке строк, чтобы выполнять сравнение одно за другим.
@SimonBenavides Я не могу придумать лучшего способа сделать это, учитывая тот факт, что вы хотите сопоставить строку из списка A с подстрокой списка B. :(
@SimonBenavides, я имею в виду, даже если вы не используете 2 цикла for, это то, что, вероятно, произойдет под капотом.
Уродливое решение с использованием Regex, используйте mylist
в качестве первого списка, потому что list
не должно быть именем переменной:
import re
mylist = ['DI', 'CI', 'CS', 'TQ','CE']
list_string = ['dd4/DI/dew', '55t/ft54/CS/rgd/fge', '32g/tt/CE/45/543/g54', '454/533/633/76']
pat = '|'.join(re.escape(y) for y in mylist)
return_list = [''.join(re.findall(pat,x)) if re.search(pat,x) else 'others' for x in list_string]
Используйте эту строку для сравнения. Это лучшее однострочное решение вашей проблемы. Но это не вернет других. В настоящее время я работаю над частью «других».
[j for i in list_string for j in i.split('/') if j in list]
#result
['DI', 'CS', 'CE']
Вы также можете использовать это
return [any([j in list for j in i.split('/')]) for i in list_string]
вывод для данных данных:
[True, True, True, False]
Ниже моя попытка:
list = ['DI', 'CI', 'CS', 'TQ', 'CE']
list_string = ['dd4/DI/dew',
'55t/ft54/CS/rgd/fge',
'32g/tt/CE/45/543/g54',
'454/533/633/76']
return_list = [tuple(filter(lambda y: y in x, list))[0] if
len(tuple(filter(lambda y: y in x, list))) else
'others'
for x in list_string]
print(return_list)
Вот результат, который совпадает с вашим ожидаемым результатом:
['DI', 'CS', 'CE', 'others']
большой! это работает идеально! большое спасибо!
что ты уже испробовал ?