列表的唯一列表

Unique list of lists

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

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

如果您想检查所有可能性,我认为您缺少一个循环 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()

在浏览列表时删除可能不是最好的主意,您应该在最后删除不需要的元素

如果,正如您在评论中所说,具有相同前三个元素的子列表总是彼此相邻(但列表不一定排序),您可以使用 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]]

这不需要任何导入,但是恕我直言,当使用 groupby 时,代码应该做什么就更清楚了。但是请注意,与您的方法不同,这两种方法都会创建一个 new 过滤列表,而不是原始列表中的 updating/deleting。

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

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

希望对您有所帮助!

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

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