Как я могу разделить список на несколько списков? - PullRequest
3 голосов
/ 10 января 2020

Я пытаюсь преобразовать [CS-PP-GE-RI-ET], который является первым элементом в списке, в:

[CS]
[CS-PP]
[CS-PP-GE]
[CS-PP-GE-RI]
[CS-PP-GE-RI-ET]

Вот что я получил до сих пор:

data = ['CS-PP-GE-RI-ET',
        'CS-PP-ET-GE',
        'CS-PP-ET-GE-BD',
        'CS-PP-ET-GE',
        'CS-PP-ET-CD-PI-GE']

word0 = []
word1 = []
for i in range(len(data)):
    # print(i)  # 0 1 2 3 4 ... however many elements are in data
    split = data[i].split('-')  # prints CS-PP-GE-RI-ET ...
    # print(split)  # this prints ['CS', 'PP', 'GE', 'RI', 'ET'] for each element
    for j in range(len(split)-1):  # you have to use range(len()-1 to iterate all the way to the end of the index count
        # print(split[j])  # this prints each element CS PP GE RI ET CS PP ...
        # word1.append(split[j])
        temp0 = split[j]
        word0.append(temp0)
        temp1 = split[j + 1]
        temp3 = temp0 + '-' + temp1
        word0.append((temp3))

    print(word0)

Это что я получаю, хотя:

['CS', 'CS-PP', 'PP', 'PP-GE', 'GE', 'GE-RI', 'RI', 'RI-ET']
['CS', 'CS-PP', 'PP', 'PP-GE', 'GE', 'GE-RI', 'RI', 'RI-ET', 'CS', 'CS-PP', 'PP', 'PP-ET', 'ET', 'ET-GE']
...

Я знаю, что мне не хватает базового c понимания str и append(), но, похоже, не могу понять это.

конечный результат должен быть:

[CS]
[CS-PP]
[CS-PP-GE]
[CS-PP-GE-RI]
[CS-PP-GE-RI-ET]
[CS]
[CS-PP]
[CS-PP-ET]
[CS-PP-ET-GE]
[CS]
...

Спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 10 января 2020

Это должно записать все ваши элементы в список, содержащий список, так как ваши списки будут нуждаться в заполнителе.

wrapper_list = list()
my_list = ['CS-PP-GE-RI-ET']
for str_item in my_list:
    temp_string = ""
    combined_string_list = list(str_item.split('-'))
    for index in range(len(str_item)):
         wrapper_list.append(["-".join(combined_string_list[0:index+1])])
print(wrapper_list)  
1 голос
/ 10 января 2020

Вы также можете сделать это так:

for word in data:
    for i in range(len(word)):
        if word[i] == '-':
            print([ word[:i] ])
    print([ word ])

Или со списком:

print( '\n'.join( str([ word[:i] ]) 
                  for word in data
                  for i in range(len(word))
                  if word[i] == '-' or i == len(word) - 1 ) )
1 голос
/ 10 января 2020

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

from itertools import accumulate

l = 'CS-PP-GE-RI-ET'.split('-')
print(*accumulate(l, lambda x, y: '-'.join([x, y])), sep='\n')

CS
CS-PP
CS-PP-GE
CS-PP-GE-RI
CS-PP-GE-RI-ET

Для общего решения вы можете сделать:

data = ['CS-PP-GE-RI-ET',
        'CS-PP-ET-GE',
        'CS-PP-ET-GE-BD',
        'CS-PP-ET-GE',
        'CS-PP-ET-CD-PI-GE']

def acc(s):
    l = s.split('-')
    func = lambda x, y: '-'.join([x, y])
    return '\n'.join(accumulate(l, func))

print(*map(acc, data), sep='\n\n')

CS
CS-PP
CS-PP-GE
CS-PP-GE-RI
CS-PP-GE-RI-ET

CS
CS-PP
CS-PP-ET
CS-PP-ET-GE

CS
CS-PP
CS-PP-ET
CS-PP-ET-GE
CS-PP-ET-GE-BD

CS
CS-PP
CS-PP-ET
CS-PP-ET-GE

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