2016-12-20 4 views
0

У меня есть этот код:P3.5: Создание Подсписок

all_jobids = ['270', '271', '274', '278', '|_279', '|_280', '|_281', '288', '289', '|_290', '|_291', '298', 
        '299', '|_300', '|_301', '|_302', '|_303', '308'] 

    intjobs = [] 
    for entry in all_jobids: 
     sub_id = 0 
     try: 
      current_id = int(entry) 
      intjobs.append(current_id) 
     # except ValueError: 
     #  sub_id = int(entry[2:]) 
     #  last_id = intjobs[-1] 
     #  intjobs[-1] = [last_id].append(sub_id) 
     except ValueError: 
      sub_id = int(entry[2:]) 

      if intjobs[-1] is list: 
       intjobs[-1].append(sub_id) 
      else: 
       last_id = intjobs[-1] 
       intjobs[-1] = [last_id].append(sub_id) 

      # intjobs[last_id] = [last_id].append(int(current_id[2:])) 
     print(entry, current_id, sub_id) 

     last_id = current_id 
    print(intjobs) 

и иметь этот результат:

[270, 271, 274, None, 288, None, 298, None, 308] 

, но я хочу, чтобы это (точки только для короткого дисплея):

[270, 271, 274, [278, ..., 281], 288, [289, 290, 291], 298, [299, ..., 303], 308] 

Так что я хочу список с дополнительными подсписок. я уже смотрел после того, как другой Q & A (эк Make Python Sublists from a list using a Separator но это не то же самое

+0

Я думаю, проблема в том, что '[last_id] .append (sub_id)' возвращает None, а не измененный список. Может быть, попробуйте 'intjobs [-1] = [last_id, sub_id]' –

ответ

0

однострочного решение (так как:. Python) является:

[[int(id) for id in sublist.split('|')] if '|' in sublist else int(sublist) for sublist in ";".join(all_jobids).replace(';|_', '|').split(';')] 

Пояснение:

";".join(all_jobids) 

Свертывает все ID точки с запятой (или)).

.replace(';|_', '|') 

Удаляет точку с запятой, где подсписки желательны и заменяет их с панелью (или separator2).

.split(';') 

Разделение строки в идентификаторах и объединенных подкатегориях.

[[[int(id) for id in sublist.split('|')] if '|' in sublist else int(sublist) for sublist in ... ] 

Принимает entrys и разбивает их на панели (или separator2), если есть один. Идентификаторы без бара остаются нетронутыми. (Кроме литья.)

Выход:

[270, 271, 274, [278, 279, 280, 281], 288, [289, 290, 291], 298, [299, 300, 301, 302, 303], 308] 

Может быть, для дальнейшей обработки это необходимо, что отдельные идентификаторы списки тоже. В этом случае простое утверждение будет:

[[int(id) for id in sublist.split('|')] for sublist in ";".join(all_jobids).replace(';|_', '|').split(';')] 

Выход:

[[270], [271], [274], [278, 279, 280, 281], [288], [289, 290, 291], [298], [299, 300, 301, 302, 303], [308]] 
+0

Выглядит хорошо. Но значения результата в списках должны содержать целые числа, а не строки. Требуемый выход: '[270, 271, 274, [278, .., 281], 288, [289, 290, 291], 298, [299, .., 303], 308]'. –

+0

Вы правы. Я добавил кастинг. Это еще одна строка, но вы можете подумать о том, чтобы сделать это немного более подробным, это производственный код. :-) –

0

Это работает:

all_jobids = ['270', '271', '274', '278', '|_279', '|_280', '|_281', '288', '289', '|_290', '|_291', '298', 
        '299', '|_300', '|_301', '|_302', '|_303', '308'] 
intjobs = [] 
in_sub = False 
for entry in all_jobids: 
    if entry.startswith('|_'): 
     entry = int(entry[2:]) 
     if not in_sub: 
      sub = [intjobs[-1], entry] 
      intjobs[-1] = sub 
      in_sub = True 
     else: 
      sub.append(entry) 
    else: 
     in_sub = False 
     intjobs.append(int(entry)) 
print(intjobs) 

Выход:

[270, 
271, 
274, 
[278, 279, 280, 281], 
288, 
[289, 290, 291], 
298, 
[299, 300, 301, 302, 303], 
308] 
0

Это может не t будет самым изящным решением, но оно работает.

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

all_jobids = ['270', '271', '274', '278', '|_279', '|_280', '|_281', '288', '289', '|_290', '|_291', '298', 
       '299', '|_300', '|_301', '|_302', '|_303', '308'] 
intjobs = [] 
sublist = [] 
current_id = None 
for entry in all_jobids: 
    try: 
     last_id = current_id 
     current_id = int(entry) 
     if sublist: 
      intjobs.append(sublist) 
      last_id = sublist 
      sublist = [] 
     elif last_id: 
      intjobs.append(last_id) 
     # intjobs.append(current_id) 

    except ValueError: 
     sub_id = int(entry[2:]) 
     # sublist.append(sub_id) 
     if sublist: 
      sublist.append(sub_id) 
     else: 
      sublist.append(last_id) 
      sublist.append(sub_id) 

    # print(entry, current_id, sub_id) 
if sublist: #if the last item was a sublist item 
    intjobs.append(sublist) 
else: 
    intjobs.append(current_id) 

print(intjobs) 

возвращает

[270, 271, 274, [278, 279, 280, 281], 288, [289, 290, 291], 298, [299, 300, 301, 302, 303], 308] 
+0

Требуемый выход: '[270, 271, 274, [278, .., 281], 288, [289, 290, 291], 298, [299, .., 303], 308]'. –

+0

Вы правы. я починил это –

0

Использование try .. except поймать ValueError исключений, вы можете получить желаемый результат, как показано ниже:

int_jobids = [] 

for i in all_jobids: 
    try: 
     int_jobids.append(int(i)) 
     if sub_list: # We use sub_list for items that start with '|_' 
      sub_list.insert(0, int_jobids.pop(-2)) 
      int_jobids.insert(-1, sub_list[:]) 
      sub_list = [] 
    except ValueError: 
     sub_list.append(int(i[2:])) 

Выход:

>>> int_jobids 
[270, 271, 274, [278, 279, 280, 281], 288, [289, 290, 291], 298, [299, 300, 301, 302, 303], 308] 
Смежные вопросы