Преобразование уникального списка в другой тип списка в Python - PullRequest
2 голосов
/ 07 апреля 2020

Stackoverflow, привет,

У меня очень нервный вопрос, который я не могу решить в течение нескольких часов.

Задача:

У меня есть list:

['Egg', 'Milk', 'Tomato', '_', 'Duck', 'Water', 'Honey', 'Soy', '_', 'Potato', 'Garlic', 'Gouda', '_', 'Beef', 'Sweet', 'Pita', 'Wine', 'Tomato']

И мне нужно преобразовать его в новый, где все компоненты между '_' будут как один элемент:

a= [['Egg', 'Milk', 'Tomato'], ['Duck', 'Water', 'Honey', 'Soy'], ['Potato', 'Garlic', 'Gouda'], ['Beef', 'Sweet', 'Pita', 'Wine', 'Tomato']].

Однако сложная часть здесь заключается в том, что у меня может быть больше «маленьких списков» внутри первоначального списка. Например, после последнего 'Tomato' это также может быть '_', а после этого - например, несколько таких компонентов, как ['Bread', 'Milk', 'Egg'].

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

['Egg', 'Milk', 'Tomato', '_', 'Duck', 'Water', 'Honey', 'Soy', '_', 'Potato', 'Garlic', 'Gouda', '_', 'Beef', 'Sweet', 'Pita', 'Wine', 'Tomato', '_', 'Bread', 'Milk', 'Egg']

Итак, я понял, что НЕ ДОЛЖЕН составлять вручную 4 разных списка, а потом объединять их, потому что может быть 5 или более списков. внутри большого, разделенного «_». Я должен сделать что-то еще. Но все, что у меня есть, это неправильные вещи:

for elem in ingridient_names:
    i=1
    if elem != '_':
        ingridient_names_final[i].append(elem)
print(ingridient_names_final)

Может кто-нибудь помочь, пожалуйста?

Ответы [ 4 ]

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

Вы можете использовать itertools.groupby для группировки последовательных строк, пока не встретите '_', а затем преобразовать их в подсписки.

>>> from itertools import groupby
>>> ingridient_names = ['Egg', 'Milk', 'Tomato', '_', 'Duck', 'Water', 'Honey', 'Soy', '_', 'Potato', 'Garlic', 'Gouda', '_', 'Beef', 'Sweet', 'Pita', 'Wine', 'Tomato']
>>> ingridient_names_final = [list(g) for k,g in groupby(ingridient_names, key=lambda i: i!='_') if k]
>>> ingridient_names_final
[['Egg', 'Milk', 'Tomato'],
 ['Duck', 'Water', 'Honey', 'Soy'],
 ['Potato', 'Garlic', 'Gouda'],
 ['Beef', 'Sweet', 'Pita', 'Wine', 'Tomato']]
1 голос
/ 07 апреля 2020

Другим решением будет преобразование списка в строку, которая позволяет использовать метод split. Возможно, не очень быстро, но это однострочный; -)

[i.split (',') for i in ','.join (l).split (',_,')]

, где l - ваш начальный список

0 голосов
/ 07 апреля 2020
    outer_list = []
    inner_list = []
    for elem in data:
    if elem != '_':
        inner_list.append(elem)
    else:
        outer_list.append(inner_list)
        inner_list = []

Это должно обрабатывать любое количество '_' в основном списке.

0 голосов
/ 07 апреля 2020
l = ['Egg', 'Milk', 'Tomato', '_', 'Duck', 'Water', 'Honey', 'Soy', '_', 'Potato', 'Garlic', 'Gouda', '_', 'Beef', 'Sweet', 'Pita', 'Wine', 'Tomato']
result = []
tmp = []
for idx, item in enumerate(l):
    if item == "_":
        result.append(tmp)
        tmp = []
    else:
        tmp.append(item)
result.append(tmp)
print(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...