Присоединение элемента, начинающегося с маленькой буквы, к предыдущему элементу списка - PullRequest
2 голосов
/ 08 апреля 2020

Stackoverflow, привет

У меня есть заданная задача c. Это касается объединения элементов в список, а также проверки на нижнюю букву.

Итак, у меня есть иерархический список со списками внутри:

ingridient_names_final=[['Egg', 'Milk', 'Tomato'], ['Duck', 'Water', 'Honey', 'Soy', 'sauce'], ['Potato', 'Garlic', 'Gouda', 'cheese'], ['Beef', 'Sweet', 'pepper', 'Pita', 'bread', 'Wine', 'vinegar', 'Tomato']]

Который должен быть преобразован в:

[['Egg', 'Milk', 'Tomato'], ['Duck', 'Water', 'Honey', 'Soy sauce'], ['Potato', 'Garlic', 'Gouda cheese'], ['Beef', 'Sweet pepper', 'Pita bread', 'Wine vinegar', 'Tomato']]

Итак, слова "сыр", "сыр", "перец", "хлеб" и "уксус" мне нужно присоединить к предыдущему элементу списка.

Я понял только этот метод islower() должен использоваться здесь:

for element in ingridient_names_final:
    # print (element)
    for element2 in element:
        # print (element2)
        if element2.islower():
            print(element2)

В результате получается:

sauce
cheese
pepper
bread
vinegar

Но как я могу присоединить их к предыдущему элементу каждого небольшого списка внутри оригинальный? Я новичок в этом языке, пожалуйста, помогите)

Ответы [ 3 ]

2 голосов
/ 08 апреля 2020

Вы можете сделать следующее, используя itertools.groupby:

from itertools import groupby

for lst in ingridient_names_final:
    new_lst = []
    for k, g in groupby(lst, key=lambda s: s[0].islower()):
        if k:
             new_lst[-1] += ' ' + ' '.join(g)
        else:
             new_lst.extend(g)
    lst[:] = new_lst

Или даже проще:

for lst in ingridient_names_final:
    new_lst = []
    for s in lst:
        if s[0].islower():
            new_lst[-1] += ' ' + s
        else:
            new_lst.append(s)
    lst[:] = new_lst
0 голосов
/ 08 апреля 2020

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

Подробнее о производительность здесь . Таким образом, в качестве альтернативы действительному решению, предложенному выше, здесь используется str.join.

result = []
for ingredients_list in ingridient_names_final:
    next_idx = 0
    count = 0
    new_ingredients_list = []

    while next_idx < len(ingredients_list) - 1:
        if ingredients_list[next_idx + 1].islower():
            count += 1
            next_idx += 1
            continue
        # Avoid numerous string concatenations
        ingredient = ' '.join(ingredients_list[next_idx - count: next_idx + 1])
        new_ingredients_list.append(ingredient)
        count = 0
        next_idx += 1
    new_ingredients_list.append(' '.join(ingredients_list[next_idx - count: next_idx + 1]))

    result.append(new_ingredients_list)
0 голосов
/ 08 апреля 2020

решение для версии регулярного выражения:

import re

ingredient_names_final = [['Egg', 'Milk', 'Tomato'],
                          ['Duck', 'Water', 'Honey', 'Soy', 'sauce'],
                          ['Potato', 'Garlic', 'Gouda', 'cheese'],
                          ['Beef', 'Sweet', 'pepper', 'Pita', 'bread', 'Wine',
                           'vinegar', 'Tomato']]


print([
    re.findall(r'[A-Z][a-z ]*(?![A-Z])', ' '.join(ingredient))
    for ingredient in ingredient_names_final
])

вывод:

[['Egg', 'Milk', 'Tomato'], ['Duck', 'Water', 'Honey', 'Soy sauce'], ['Potato', 'Garlic', 'Gouda cheese'], ['Beef', 'Sweet pepper', 'Pita bread', 'Wine vinegar', 'Tomato']]

Или следующие регулярные выражения тоже работают.

print([
    re.split(r'(?<!^)(?=[A-Z])', ' '.join(ingredient))
    for ingredient in ingredient_names_final
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...