我有一个这样的嵌套列表:
lists = [[['L', 5], ['B', 20], ['A', 10]],
[['B', 200], ['J', 90]],
[['L', 5], ['L', 6]],
[['A', 10], ['L', 12], ['A', 11], ['A', 15]]]
如何删除字符串不是A,B,L的子列表(删除整个子列表,不仅删除不是A,B,L的列表) 如何查找无效项所属的子列表的索引(在本例中为1)(需要下一个任务的索引)
这是我尝试过的方法,它可以找到无效的项目,但我不知道找到子列表的索引
for j in range (len(lists)):
for i in range (len(lists[j])):
if lists[j][i][0] != 'L' and lists[j][i][0] != 'A' and lists[j][i][0] != 'B':
return False
return True
我希望结果是这样的:
lists = [[['L', 5], ['B', 20], ['A', 10]],
[['L', 5], ['L', 6]],
[['A', 10], ['L', 12], ['A', 11], ['A', 15]]]
答案 0 :(得分:2)
您可以使用反向删除惯用法有效地就地修改lists
:
keep = ('A', 'B', 'L')
for i in reversed(range(len(lists))):
if any(l[0] not in keep for l in lists[i]):
del lists[i]
print(lists)
# [[['L', 5], ['B', 20], ['A', 10]],
# [['L', 5], ['L', 6]],
# [['A', 10], ['L', 12], ['A', 11], ['A', 15]]]
如果子列表的第一个元素不在any
中,则 keep
返回True。
或者,您可以使用列表理解功能创建新列表:
[l for l in lists if not any(l_[0] not in keep for l_ in l)]
# [[['L', 5], ['B', 20], ['A', 10]],
# [['L', 5], ['L', 6]],
# [['A', 10], ['L', 12], ['A', 11], ['A', 15]]]
答案 1 :(得分:1)
正如@coldspeed所建议的那样,使用一组来检查字母是否存在可以实现最佳的O(1)查找。
如果您不想使用诸如any()
之类的内置函数,请首先创建一个检查每个子列表内部列表的首字母是否存在的函数:
html
或者,如果您愿意,也可以不进行元组拆包:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script src="https://cdn.dhtmlx.com/scheduler/edge/dhtmlxscheduler.js"></script>
<link href="https://cdn.dhtmlx.com/scheduler/edge/dhtmlxscheduler_material.css"
rel="stylesheet" type="text/css" charset="utf-8">
<style>
html, body{
margin:0px;
padding:0px;
height:100%;
overflow:hidden;
}
</style>
</head>
<body>
<div id="scheduler_here" class="dhx_cal_container"
style='width:100%; height:100%;'>
<div class="dhx_cal_navline">
<div class="dhx_cal_prev_button"> </div>
<div class="dhx_cal_next_button"> </div>
<div class="dhx_cal_today_button"></div>
<div class="dhx_cal_date"></div>
<div class="dhx_cal_tab" name="day_tab"></div>
<div class="dhx_cal_tab" name="week_tab"></div>
<div class="dhx_cal_tab" name="month_tab"></div>
</div>
<div class="dhx_cal_header"></div>
<div class="dhx_cal_data"></div>
</div>
<script>
scheduler.init('scheduler_here', new Date(2019,0,20), "week");
if (scheduler.parse([
{text:"Meeting", start_date:"15/01/2020 14:00", end_date:"15/01/2020 17:00"},
{text:"Conference", start_date:"16/01/2020 12:00", end_date:"16/01/2020 19:00"},
{text:"Interview", start_date:"17/01/2020 09:00", end_date:"17/01/2020 10:00"}
],"json")) {
alert("OK");
}
else {
alert("NOK")
}
</script>
</body>
然后,您可以使用过滤出的错误列表来重建新列表:
valid = {"A", "B", "L"}
def check_valid(sublst):
for fst, *_ in sublst:
if fst not in valid:
return False
return True
或作为列表理解:
def check_valid(sublst):
for lst in sublst:
if lst[0] not in valid:
return False
return True
注意:为了方便起见,最好使用内置函数,因为它省去了重新设计轮子的麻烦,并且通常可以使代码更短,更简洁。