我有一个嵌套列表作为示例:
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]]
答案 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]]