列表的唯一列表
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]]
我有一个嵌套列表作为例子:
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]]