Почему в новый список не добавляется элемент старого списка, отвечающий условиям

450 просмотра
0
0 Комментариев

Есть список — list. Нужно на его базе сделать новый список — list2, в который не войдут элементы, начинающиеся на s и заканчивающиеся на e.

Написал код (добавлен ниже).

Почему в новый список попадают только элементы '1' и '2', а 'sok' не попадает. По условию он не должен попадать, если оба условия выполняются. У него одно условие выполняется, а другое не выполняется. Он же должен попадать в новый список?

list = ['1', '2', 'some', 'sosoeye', 'sok', 'so talk about e' ]
dlina = len(list)
list2 = []
for number in range(dlina):
    nitem = list[number]
    if nitem[0] != 's' and nitem[-1] != 'e':
        list2.append(nitem)
 
print(list2)

Результат работы программы: [‘1’, ‘2’]


Добавить комментарий

3 Answers

Python Опубликовано 14.12.2018
0

Вот более идиоматическое решение использующее list comprehension с условием:

исходный список:

In [97]: lst = ['1', '2', 'some', 'sosoeye', 'sok', 'so talk about e' ]

решение:

In [98]: lst2 = [x for x in lst if not (x.startswith('s') and x.endswith('e'))]

результат:

In [99]: lst2
Out[99]: ['1', '2', 'sok']

Также можно воспользоваться регулярными выражениями:

In [9]: import re
 
In [10]: lst2 = [x for x in lst if not (re.match(r'^s.*e$', x))]
 
In [11]: lst2
Out[11]: ['1', '2', 'sok']

Разбор RegEx’а на английском…


PS не стоит использовать зарезервированные слова (например: list, dict, etc.) в качестве имен переменных, чтобы избежать неприятных эффектов:

In [1]: list = list('abc')
 
In [2]: list
Out[2]: ['a', 'b', 'c']
 
In [3]: list2 = list('xyz')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-02adb35530fa> in <module>()
----> 1 list2 = list('xyz')
 
TypeError: 'list' object is not callable

Добавить комментарий
0

Вместо

if nitem[0] != 's' and nitem[-1] != 'e':

используйте

if nitem[0] != 's' or nitem[-1] != 'e':

(or вместо and).


Вывод:

['1', '2', 'sok']

Добавить комментарий
0

Ваша программа будет работать правильно, если написать во так:

lst = ['1', '2', 'some', 'sosoeye', 'sok', 'so talk aboiy e']
lst2 =[]
for i in lst:
    if i[0] != 's' or i[-1] != 'e':
        lst2.append(i)
print(lst2)

И вывод:

['1', '2', 'sok']

Это происходит потому, что операторы сравнения возвращают булевы значения, которые потом используются в операторе and, и таким образом в вашем коде операндами оператора and становятся False и True.

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up