Как удалить целые числа с тире из списка, сохраняя тире в объектах - PullRequest
0 голосов
/ 22 октября 2018

У меня есть список, заполненный следующими строками:

    list1 = ['01', '02', '03', '04', 05', '101-1', '101-2', 101-3', 
    'Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']

Мне нужно удалить как обычные целые числа, так и целые числа с тире в них, сохраняя имена, а также имена с тирев них.На данный момент я написал следующий код:

Этот код удаляет все тире (но как я могу указать только удалить дефисы из целочисленных строк, а не строк объекта):

list2 = [i.replace('-','') for i in list1 if i.isdigit()]

Этот код удаляет все целые числа, заключенные в строки:

 list3 = [x for x in list2 if not (x.isdigit() or x[0] == '-' and x[1:].isdigit())]

С помощью приведенного выше кода я могу удалить все целые числа, но он также удаляет все «Имена» с тире в них.а также - мне нужно сохранить имена с тире в них.Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

(Так как это помеченные панды) Вы можете использовать str.replace + str.isdigit:

s = pd.Series(list1)
s[~s.str.replace('-', '', regex=False).str.isdigit()]

8      Name1
9      Name2
10     Name3
11    Name-4
12    Name-5
13    Name-6
dtype: object

Чтобы получить список, позвоните .tolist() по результату.

Если перевести это на чистый Python, у нас есть список comp-эквивалента (смотрите ma, без регулярных выражений):

>>> [x for x in list1 if not x.replace('-', '').isdigit()]
['Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']
0 голосов
/ 22 октября 2018

Я бы использовал явное for loop сохранение в переменной res ИЛИ list comprehension.

import re
list1 = ['01', '02', '03', '04', '05', '101-1', '101-2', '101-3', 'Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']
res = []
for val in list1:
    if re.search('[a-zA-Z]', val):
        res.append(val)

Если мы напечатаем res, мы получим.

>>> res
>>> ['Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']

В случае понимания списка, я бы сделал:

[val for val in list1 if re.search('[a-zA-Z]', val)]

>>> ['Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']
0 голосов
/ 22 октября 2018

Вы можете использовать регулярное выражение - совпадения объектов являются правдивыми, None - ложными.

import re
>>> list1 = ['01', '02', '03', '04', '05', '101-1', '101-2', '101-3', 
...:         'Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']
...:         
>>> [x for x in list1 if not re.match(r'\d+(-\d+)?$', x)]
>>> ['Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']

Демонстрация на regex101.com

(The ^ не требуется в коде Python, потому что re.match выполняет поиск в начале строки.)

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