Python: добавление слова из списка строк в другой список строк - PullRequest
0 голосов
/ 10 июля 2011

Я пытаюсь добавить целые слова из одной строки в другую, если они содержат определенный символ:

mylist = ["hahah", "hen","cool", "breaker", "when"]
newlist = []

for word in mylist:
    store = word          #stores current string
    if 'h' in word:      #splits string into characters and searches for 'h'
        newlist += store #adds whole string to list


print newlist

ожидаемый результат:

newlist = ["hahah","hen","when"]

но вместо этого яполучаю:

newlist =  ['h', 'a', 'h', 'a', 'h', 'h', 'e', 'n', 'w', 'h', 'e', 'n']

Как получить ожидаемый результат?

Ответы [ 4 ]

7 голосов
/ 10 июля 2011

Использование append [документы] :

newlist.append(store)

Или короче (используя понимание списка [документы] ):

newlist = [word for word in mylist if 'h' in word]

Почему newlist += store не работает?

Thisсовпадает с newlist = newlist + store и расширяет существующий список (слева) на все элементы в последовательности [документы] на правой стороне.Если вы будете следовать документации, вы найдете следующее:

s + t объединение s и t

В Python не только списки являются последовательностями, но строки тоже (последовательность символов).Это означает, что каждый элемент последовательности (→ каждый символ) добавляется в список.

1 голос
/ 10 июля 2011

Из интереса я решил посмотреть, какое из трех решений (цикл, понимание списка и функция filter()) было самым быстрым. Мой тестовый код и результаты ниже для всех, кто заинтересован.

* 1004 инициализации * >>> import timeit >>> num_runs = 100000 >>> setup_statement = 'mylist = ["hahah", "hen","cool", "breaker", "when"]' Loop

>>> loop_statement = """
newlist = []
for word in mylist:
    if 'h' in word:
        newlist.append(word)"""
>>> timeit.timeit(loop_statement, setup_statement, number=num_runs) / num_runs
4.3187308311462406e-06

Понимание списка

>>> list_statement = "newlist = [word for word in mylist if 'h' in word]"
>>> timeit.timeit(list_statement, setup_statement, number=num_runs) / num_runs
2.9228806495666502e-06

Фильтр вызовов

>>> filter_statement = """
filt = lambda x: "h" in x
newlist = filter(filt, mylist)"""
>>> timeit.timeit(filter_statement, setup_statement, number=num_runs) / num_runs
7.2317290306091313e-06

Результаты

  1. Понимание списка в 2.92us
  2. Цикл на 4,32 мкс (на 48% медленнее, чем в списке)
  3. Фильтр вызовов на 7,23 мкс (на 148% медленнее, чем в списке)
0 голосов
/ 10 июля 2011

Другой альтернативный синтаксис для выражения этого - использовать filter. Таким образом, реализация вашей проблемы будет выглядеть примерно так:

filt = lambda x: 'h' in x
newlist1 = filter(filt, mylist)
0 голосов
/ 10 июля 2011

попробуйте использовать:

newlist.append(store)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...