Отдельный список данных с помощью Python - PullRequest
2 голосов
/ 03 июля 2019

У меня есть список из нескольких строк), и я хочу разделить их следующим образом:

MainList:

[
    GENERAL NOTES & MISCELLANEOUS DETAILS_None_None_None, 
    STR_XX_XX_0001, 
    STR_XX_XX_0002, 
    STR_XX_XX_0003, 
    GENERAL ARRANGEMENT_None_None_None, 
    STR_XX_XX_10001.0, 
    STR_XX_XX_10002.0, 
    STR_XX_XX_10003.0, 
    STR_XX_XX_10004.0, 
    STR_XX_XX_10005.0, 
    STR_XX_XX_10006.0

]

если строка "_None_None_None" найдена в основном списке, она может добавить этоданные в новом пустом списке и оставшееся значение STR_XX_XX_0001 в другом списке, и оно продолжается до тех пор, пока не найдет другую строку с "_None_None_None" и сделает то же самое.

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

    empty1 = []
    empty2 = []

    for i in MainList:
            if "_None_None_None" in i:
               empty1.append(i)
            # Need help on hear onwards
            else:
                while "_None" not in i:
                    empty2.append(i)
                break

Я ожидаю результата вывода в два списка.Примерно так:

List1:

[
    GENERAL NOTES & MISCELLANEOUS DETAILS_None_None_None, 
    GENERAL ARRANGEMENT_None_None_None
]

List2:

[
[STR_XX_XX_0001,STR_XX_XX_0002,STR_XX_XX_0003],[STR_XX_XX_10001.0,STR_XX_XX_10002.0,STR_XX_XX_10003.0,STR_XX_XX_10004.0,STR_XX_XX_10005.0,STR_XX_XX_10006.0]
]

List2 - список с подсписками

Ответы [ 2 ]

3 голосов
/ 03 июля 2019

Вы делаете это слишком сложным, вы можете позволить списку проходить весь путь без внутреннего цикла while.Просто примите решение для каждого элемента, как показано в цикле:

empty1 = []
empty2 = []

for i in MainList:
    if "_None_None_None" in i:
        empty1.append(i)
    else:
        empty2.append(i)

Это даст вам два списка:

> empty1
> ['GENERAL NOTES & MISCELLANEOUS DETAILS_None_None_None',
 'GENERAL ARRANGEMENT_None_None_None']

> empty2
> ['STR_XX_XX_0001',
 'STR_XX_XX_0002',
 'STR_XX_XX_0003',
 'STR_XX_XX_10001.0',
 'STR_XX_XX_10002.0',
 'STR_XX_XX_10003.0',
 'STR_XX_XX_10004.0',
 'STR_XX_XX_10005.0',
 'STR_XX_XX_10006.0']

РЕДАКТИРОВАТЬ На основе комментария

Если комментатор указан правильно и вы хотите сгруппировать значения, отличные от NONE, в отдельные списки, это хороший вариант использования для itertools.groupby.Это сделает группы для вас удобным и эффективным способом, и ваш цикл будет выглядеть почти одинаково:

from itertools import groupby

empty1 = []
empty2 = []

for k, i in groupby(MainList, key = lambda x: "_None_None_None" in x):
    if k:
        empty1.extend(i)
    else:
        empty2.append(list(i))

Это даст вам тот же empty1, но empty2 не будет спискомсписки:

[['STR_XX_XX_0001', 'STR_XX_XX_0002', 'STR_XX_XX_0003'],
 ['STR_XX_XX_10001.0',
  'STR_XX_XX_10002.0',
  'STR_XX_XX_10003.0',
  'STR_XX_XX_10004.0',
  'STR_XX_XX_10005.0',
  'STR_XX_XX_10006.0']]
1 голос
/ 03 июля 2019

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

dlist = ["GENERAL NOTES & MISCELLANEOUS DETAILS_None_None_None","STR_XX_XX_0001","STR_XX_XX_0002","STR_XX_XX_0003", "GENERAL ARRANGEMENT_None_None_None","STR_XX_XX_10001.0","STR_XX_XX_10002.0", "STR_XX_XX_10003.0", "STR_XX_XX_10004.0", "STR_XX_XX_10005.0", "STR_XX_XX_10006.0"]

with_None = [elem for elem in dlist if elem.endswith("_None")]
without_None = [elem for elem in dlist if not elem.endswith("_None")]

Вы также можете написать универсальную функцию для процесса:

def cust_sept(src_list, value_to_find,f):
    with_value, without_value = [elem for elem in dlist if f(elem,value_to_find)],[elem for elem in dlist if not f(elem,value_to_find)]
    return with_value,without_value

list_one,list_two = cust_sept(dlist,"_None",str.endswith)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...