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

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

['C04.123.123.123', 'C03.456.456.456', 'C05.789.789.789']

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

['C04.123.123.123', 'C04.123.123', 'C04.123', 'C04']

Как мне этого добиться?Я пытался изучить itertools.combination и стандартные функции разделения, но не повезло.

Ответы [ 5 ]

0 голосов
/ 05 декабря 2018

Вы можете использовать itertools.accumulate:

from itertools import accumulate
s = 'C04.123.123.123'
# define the incremental step
append = lambda s, e: s + '.' + e
result = list(accumulate(s.split('.'), append))[::-1]
0 голосов
/ 05 декабря 2018

Попробуйте это:

list(accumulate(s.split('.'), lambda a, b: a + '.' + b))[::-1]
0 голосов
/ 04 декабря 2018

Однострочный, простой для понимания (менее легко настраиваемый :)), использующий str.rsplit с maxsplit, постепенно увеличивающимся до количества точек:

lst = ['C04.123.123.123', 'C03.456.456.456', 'C05.789.789.789']

result = [x.rsplit(".",i)[0] for x in lst for i in range(x.count(".")+1) ]

результат:

['C04.123.123.123',
 'C04.123.123',
 'C04.123',
 'C04',
 'C03.456.456.456',
 'C03.456.456',
 'C03.456',
 'C03',
 'C05.789.789.789',
 'C05.789.789',
 'C05.789',
 'C05']

Единственное, что меня раздражает, это то, что он вызывает split много, чтобы сохранить первый элемент.Жаль, что нет встроенной функции lazy split, которую мы могли бы вызвать next on.

0 голосов
/ 04 декабря 2018
start_list = ['C04.123.123.123', 'C03.456.456.456', 'C05.789.789.789']
final_list = []
for item in start_list:
   broke_up = item.split('.')
   temp = []
   full_item = []
   for sect in broke_up:
      temp.append(sect)
      full_item.append(".".join(temp))
   final_list.extend(full_item)
print(final_list)

В качестве альтернативы вы можете final_list.append(full_item) сохранить отдельные списки для каждой строки в исходном списке.

0 голосов
/ 04 декабря 2018

Вы можете использовать понимание списка:

d = ['C04.123.123.123', 'C03.456.456.456', 'C05.789.789.789']
new_d = [a+('.' if i else '')+'.'.join(i) for a, *c in map(".".split, d) 
     for i in [c[:h] for h in range(len(c)+1)][::-1]]

Вывод:

['C04.123.123.123', 'C04.123.123', 'C04.123', 'C04', 'C03.456.456.456', 'C03.456.456', 'C03.456', 'C03', 'C05.789.789.789', 'C05.789.789', 'C05.789', 'C05']
...