2015-05-11 2 views
1

Скажем, у меня есть следующий списокКак я могу найти часть строки в список в Python

List = ['Apple', 'Banana', 'Orange', 'Grapes'] 

От этого я хочу искать Apple я должен использовать следующий код

if 'Apple' in List: 
    print "Found" 

Но я хочу найти строку, содержащую 'App' Что мне делать?

Я могу использовать For цикл и if заявление в сочетании.

for items in List: 
    if 'App' in items: 
     print "Found" 

Но есть ли другой способ сделать этот процесс?

ответ

0
if(True in ["app" in k for k in ["apple","orange","grapes"]]): 
    print("woot") 

Более или менее читаемый, но делает то же самое.

вы можете даже сделать это один лайнер,

print "woot" if(True in ["app" in k for k in ["apple","orange","grapes"]]) else "" 
+0

Зачем составлять список, а затем проверять его на 'True' вместо того, чтобы просто использовать' any'? – abarnert

+0

Не знаю, о чем я знаю. – kpie

2

Вы можете использовать map + any:

lst = ['apple', 'banana'] 

if any(map(lambda x: 'app' in x.lower(), lst)): 
    print "Found" 

Чуть больше вещий:

lst = ['apple', 'banana'] 
if any(['app' in x.lower() for x in lst]): 
    print "Found" 

чуть более оптимизированную версию используя генератор (если первым элементом является «яблоко», оно не будет chec К остальной части ЛСТ):

generator = ('app' in x.lower() for x in lst) 
if any(generator): 
    print "Found" 
+0

Что такое генератор? этот синтаксис выглядит как n-кортеж для меня. – kpie

+0

@kpie: начните с [Итераторы] (https://docs.python.org/3/tutorial/classes.html#iterators) в учебнике и прочитайте в конце главы. – abarnert

+0

http://stackoverflow.com/questions/1756096/understanding-generators-in-python - по сути, это ленивый способ повторения списка. Вместо этого, выполняя всю работу сразу, она будет выполнять работу только с текущим элементом во время итерации. –

0

Если вы просто ищете что-то более кратким, точно такая же логика может быть написана с comprehension (в данном случае generator expression) и функция any:

if any('App' in item for item in List): 
    print "Found" 

Если это не так очевидно, почему это делает почти то же самое, как существующий код:

Если вы расширить понимание в явном for заявлении, это выглядит следующим образом:

for item in List: 
    yield 'App' in item 

Затем any функция перебирает каждой вещи, которые не получили yield-е изд, пока один из них, правда, или до тех пор, пока он получает в конец, и все они были ложными.

Таким образом, единственное отличие заключается в том, что вместо того, чтобы печатать "Found" один раз за каждый раз, когда что-то было найдено, оно просто печатает его один раз, а затем прекращает искать.


Если вы хотите что-то более эффективное , вам необходимо изменить структуру данных. Но я сомневаюсь, что это проблема, когда у вас есть только 4 вещи в List.