Python: как разбить список на основе определенного элемента - PullRequest
0 голосов
/ 01 октября 2018

Если у нас есть следующий список в Python

sentence = ["I", "am", "good", ".", "I", "like", "you", ".", "we", "are", "not", "friends", "."]

Как мне разбить это, чтобы получить список, который содержит элементы, которые заканчиваются с полной остановкой?Поэтому я хочу получить следующие элементы в моем новом списке:

["I","am","good","."]
["I","like","you","."]
["we","are","not","friends","."]

Мои попытки на данный момент:

cleaned_sentence = []
a = 0
while a < len(sentence):
    current_word = sentence[a]
    if current_word == "." and len(cleaned_sentence) == 0:
        cleaned_sentence.append(sentence[0:sentence.index(".")+1])
        a += 1
    elif current_word == "." and len(cleaned_sentence) > 0:
        sub_list = sentence[sentence.index(".")+1:-1]
        sub_list.append(sentence[-1])
        cleaned_sentence.append(sub_list[0:sentence.index(".")+1])
        a += 1
    else:
        a += 1

for each in cleaned_sentence:
    print(each)

Запуск этого на sentence производит

['I', 'am', 'good', '.']
['I', 'like', 'you', '.']
['I', 'like', 'you', '.']

Ответы [ 5 ]

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

Этот ответ стремится быть самым простым ...

Данные

sentences = ["I", "am", "good", ".",
            "I", "like", "you", ".",
            "We", "are", "not", "friends", "."]

Мы инициализируем список вывода и представляем, что мы начинаем новое предложение

l, start = [], 1

Цикл в списке данных, используя w для адресации текущего слова

  • , если мы находимся в начале нового предложения, мы очищаем флаги добавляем пустой список в конец списка вывода
  • мы добавляем текущее слово в последний подсписок (обратите внимание, что ① мы гарантируем, что есть хотя бы последний подсписок (вам нравятся аллитерации?) и② каждое слово добавляется)
  • если мы в конце - мы встретили "." - мы снова поднимаем флаг.

Обратите внимание на один комментарий ...

for w in sentences:
    if start: start = l.append([]) # l.append() returns None, that is falsey...
    l[-1].append(w)
    if w == ".": start = 1
0 голосов
/ 01 октября 2018
sentence = ["I", "am", "good", ".", "I", "like", "you", ".", "we", "are", "not", "friends", "."]

output = []
temp = []
for item in sentence:
    temp.append(item)
    if item == '.':
        output.append(temp)
        temp = []
if temp:
    output.append(temp)

print(output)
0 голосов
/ 01 октября 2018

Мы можем сделать это в два этапа: сначала вычислить индексы, в которых расположены точки, а затем сделать срезы, например:

idxs = [i for i, v in enumerate(sentence, 1) if v == '.']   # calculating indices

result = [sentence[i:j] for i, j in zip([0]+idxs, idxs)]    # splitting accordingly

Затем получится:

>>> [sentence[i:j] for i, j in zip([0]+idxs, idxs)]
[['I', 'am', 'good', '.'], ['I', 'like', 'you', '.'], ['we', 'are', 'not', 'friends', '.']]

Затем вы можете, например, напечатать отдельные элементы с помощью:

for sub in [sentence[i:j] for i, j in zip([0]+idxs, idxs)]:
    print(sub)

Затем будет напечатано:

>>> idxs = [i for i, v in enumerate(sentence, 1) if v == '.']
>>> for sub in [sentence[i:j] for i, j in zip([0]+idxs, idxs)]:
...     print(sub)
...
['I', 'am', 'good', '.']
['I', 'like', 'you', '.']
['we', 'are', 'not', 'friends', '.'] 
0 голосов
/ 01 октября 2018

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

from itertools import groupby
i = (list(g) for _, g in groupby(sentence, key='.'.__ne__))
print([a + b for a, b in zip(i, i)])

Это выводит:

[['I', 'am', 'good', '.'], ['I', 'like', 'you', '.'], ['we', 'are', 'not', 'friends', '.']]

Если ваш список не всегда заканчивается '.', тогда вы можете использовать itertools.zip_longestвместо:

sentence = ["I", "am", "good", ".", "I", "like", "you", ".", "we", "are", "not", "friends"]
i = (list(g) for _, g in groupby(sentence, key='.'.__ne__))
print([a + b for a, b in zip_longest(i, i, fillvalue=[])])

Это выводит:

[['I', 'am', 'good', '.'], ['I', 'like', 'you', '.'], ['we', 'are', 'not', 'friends']]
0 голосов
/ 01 октября 2018

Использование простой итерации.

Демонстрация:

sentence = ["I", "am", "good", ".", "I", "like", "you", ".", "we", "are", "not", "friends", "."]
last = len(sentence) - 1
result = [[]]
for i, v in enumerate(sentence):
    if v == ".":
        result[-1].append(".")
        if i != last:
            result.append([])
    else:
        result[-1].append(v)
print(result)

Вывод:

[['I', 'am', 'good', '.'], ['I', 'like', 'you', '.'], ['we', 'are', 'not', 'friends', '.']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...