P3.5:创建子列表

时间:2016-12-20 10:39:59

标签: python list sublist

我有这段代码:

    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(e.q。 Make Python Sublists from a list using a Separator 但它不一样。

4 个答案:

答案 0 :(得分: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)

以分号(或separator1)汇总所有ID。

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

删除需要子列表的分号,并用条形图(或separator2)替换它们。

.split(';')

将字符串拆分为ID和连接的子列表。

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

如果有的话,请在栏上(或separator2)进行委托和分割。没有栏的ID保持不变。 (除了演员。)

<强>输出:

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

可能需要进一步处理,单个ID也是列表。在这种情况下,简单的陈述将是:

[[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]]

答案 1 :(得分: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]

答案 2 :(得分:0)

这可能不是最优雅的解决方案,但它确实有效。

这会创建一个较小的列表子列表,每次正常&#39;项目被添加。

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]

答案 3 :(得分: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]