Добавить определенные элементы в список - PullRequest
0 голосов
/ 18 октября 2019

У меня есть список со строками, и я хотел бы добавить два элемента рядом друг с другом, если они не являются буквами. Вот мой список.

n=['u', '<', '=', 'd', 'd', '<', '<', 'f']

Теперь я хотел бы объединить знаки «больше», «равно» и «меньше» в списке в одну строку, если они расположены рядом друг с другом. Я перепробовал несколько методов и не могу найти тот, который не супер неэффективен или не работает.

1 Ответ

4 голосов
/ 18 октября 2019

Вы можете использовать itertools.groupby для эффективной итерации по этим группам, а затем накапливать результаты в новом списке, либо присоединяя и добавляя, либо расширяя группу .... Итак:

>>> from itertools import groupby
>>> n = ['u', '<', '=', 'd', 'd', '<', '<', 'f']
>>> new_n = []
>>> for is_letter, group in groupby(n, str.isalpha):
...     if not is_letter:
...         new_n.append(''.join(group))
...     else:
...         new_n.extend(group)
...
>>> new_n
['u', '<=', 'd', 'd', '<<', 'f']

И просточтобы уточнить, что делает itertools.groupby:

>>> [(k, list(g)) for k,g in groupby(n, str.isalpha)]
[(True, ['u']), (False, ['<', '=']), (True, ['d', 'd']), (False, ['<', '<']), (True, ['f'])]

Приятно то, что это делает один проход по списку (дает вам линейную сложность по времени) и должно быть настолько эффективным, насколько вы можете надеяться с точки зрениягруппировка, потому что itertools реализовано в C.

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