我有这段代码:
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 但它不一样。
答案 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]