2010-08-19 2 views
5

Если у меня есть список PhoneDirectory Например:Substring Сравнения в питоне

['John:009878788677' , 'Jefrey:67654654645' , 'Maria:8787677766'] 

Что это функция, которая может быть использование для сравнения Наличия подстроки (например: Joh) в каждой записи в списке.

Я попытался с помощью

if(PhoneDirectory.find(Joh) != -1) 

, но он не работает

любезно помочь ..

+0

Ваше именование мало. Имена переменных основной буквы обычно зарезервированы по правилам классам. PhoneDirectory ищет список строк для меня, я бы назвал это phonenumbers в соответствии с соглашениями об именах Python. Я считаю полезным иметь имена переменных списка как множественные. –

+0

Просто, чтобы указать, не лучше ли это хранить в качестве словаря? '{s.split (": ") [0]: s.split (": ") [1] для s in ...}' – katrielalex

ответ

15

Если вы хотите, чтобы проверить каждую запись отдельно:

for entry in PhoneDirectory: 
    if 'John' in entry: ... 

Если вы просто хотите знать, если любой запись удовлетворяет условию и пофиг, которые один:

if any('John' in entry for entry in PhoneDirectory): 
    ... 

Обратите внимание, что any не будет работать «впустую» - он вернет True, как только найдет один запись, удовлетворяющая условию (если никакие записи не соответствуют условию, необходимо проверить каждый из них, чтобы, конечно, подтвердить это, а затем возвращает False).

+4

+1 для 'any'. Очень круто. –

+0

Насколько вы близки к разработке Python, знаете ли вы, почему никто не возвращает первое «истинное» значение (скажем, «Джонни»), но только менее полезное True (даже интерпретатор должен знать точный ответ). То есть: работать как в Python, так и в принципе «полезного результата» в Lisp? Кстати, может быть, это должно быть: если есть (entry.startswith'John: 'в записи для записи в PhoneDirectory) –

+0

@Tony, так как 'any' должен возвращать' False' (например, для пустого списка, не может просто " верните некоторое ложное значение из последовательности "), когда он говорит« нет », по причине симметрии было бы лучше, если бы он всегда возвращал логическое значение.Повторяйте свое BTW, возможно, но (если это так), то только после исправления синтаксической ошибки в вашем предложении (поместите круглые скобки вокруг «John:» ';-). –

0

Вы можете сделать раскол на «:» и искать вхождения то, что вы ищете в первом элементе результирующего массива.

dir = ['John:009878788677' , 'Jefrey:67654654645' , 'Maria:8787677766']; 
for a in dir: 
    values = a.split(":") 
    if values[0] == "John": 
     print("John's number is %s" % (values[1])) 
+0

Немного сложнее, нет необходимости разделять каждую запись. –

+0

Правда. Это единственный способ, которым я знаю, как это сделать в Python! :-) Любил «любой» ответ. –

+0

Спасибо, это было здорово. –

1

Поскольку никто не рекомендовал это еще, я хотел бы сделать:

all_johns = [p for p in PhoneDirectory if 'Joh' in p] 
0

Если счетчики производительности для решения этой задачи использовать некоторые SuffixTree реализации. Или просто запустите какой-либо механизм СУБД, выполнив операцию индексирования.

3
if any(entry.startswith('John:') in entry for entry in PhoneDirectory) 

Но я бы приготовить что-нибудь с двумя элементами, как вы список строк не подходит к задаче:

PhoneList = ['John:009878788677' , 'Jefrey:67654654645' , 'Maria:8787677766'] 

numbers = { a:b 
      for item in PhoneList 
      for a,_,b in (item.partition(':'),) 
      } 

print numbers 
print "%s's number is %s." % ('John', numbers['John'])