清单的唯一清单

时间:2019-10-08 09:48:25

标签: python list nested-loops

我有一个嵌套列表作为示例:

lst_a = [[1,2,3,5], [1,2,3,7], [1,2,3,9], [1,2,6,8]]

我正在尝试检查嵌套列表元素的前3个索引是否与其他元素相同。

如果[1,2,3]存在于其他列表中,则删除包含该列表的所有其他嵌套列表元素。这样嵌套列表是唯一的。

我不确定执行此操作的最pythonic方式。

for i in range(0, len(lst_a)):
    if lst[i][:3] == lst[i-1][:3]:
         lst[i].pop()

所需的输出:

lst_a = [[1,2,3,9], [1,2,6,8]]

4 个答案:

答案 0 :(得分:1)

如果正如您在评论中所述,具有相同的前三个元素的子列表总是彼此相邻(但列表未必排序),则可以使用"use strict"; const arr = [ { name: 'A1', series: 'A series', }, { name: 'A2', series: 'A series', }, { name: 'B1', series: 'B series', }, { name: 'C1', }, ]; const output = {}; for (const { name, series = '' } of arr) { if (!output[series]) { output[series] = [name]; } else { output[series].push(name); } } console.log(output);对这些元素进行分组,然后获得来自每个组的itertools.groupby

next

或者将列表理解与>>> from itertools import groupby >>> lst_a = [[1,2,3,5], [1,2,3,7], [1,2,3,9], [1,2,6,8]] >>> [next(g) for k, g in groupby(lst_a, key=lambda x: x[:3])] [[1, 2, 3, 5], [1, 2, 6, 8]] 一起使用,并将当前元素与最后一个元素进行比较:

enumerate

这不需要任何导入,但是使用>>> [x for i, x in enumerate(lst_a) if i == 0 or lst_a[i-1][:3] != x[:3]] [[1, 2, 3, 5], [1, 2, 6, 8]] 时的恕我直言,代码应该执行的操作要清楚得多。但是请注意,与您的方法不同,这两个方法都会创建一个 new 过滤列表,而不是从原始列表中进行更新/删除。

答案 1 :(得分:0)

如果您要检查所有可能性,我认为您缺少循环For。我想它应该是:

for i in range(0, len(lst_a)):
   for j in range(i, len(lst_a)):
      if lst[i][:3] == lst[j][:3]:
         lst[i].pop()

删除列表中的内容可能不是最好的主意,应该在最后删除不想要的元素

答案 2 :(得分:0)

按照您的方法,找到以下代码:

lst=[lst_a[0]]
for li in lst_a[1:]:
    if li[:3]!=lst[0][:3]:
        lst.append(li)
print(lst)

希望这会有所帮助!

答案 3 :(得分:0)

您可以使用字典来过滤列表:

dct = {tuple(i[:3]): i for i in lst}
# {(1, 2, 3): [1, 2, 3, 9], (1, 2, 6): [1, 2, 6, 8]}

list(dct.values())
# [[1, 2, 3, 9], [1, 2, 6, 8]]