从嵌套列表中删除子列表(子列表的查找索引)

时间:2019-01-09 10:02:00

标签: python list nested-lists

我有一个这样的嵌套列表:

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

2 个答案:

答案 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">&nbsp;</div>
            <div class="dhx_cal_next_button">&nbsp;</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

注意:为了方便起见,最好使用内置函数,因为它省去了重新设计轮子的麻烦,并且通常可以使代码更短,更简洁。