根据最后两个元素删除具有重复项的嵌套列表中的列表
Remove lists within a nested list with duplicates based on last two elements
我有一个这样的嵌套列表:
my_list = [['10', 'A', 'A'], ['5', 'B', 'A'], ['2', 'B', 'B'], ['10','A','B']]
我想检查最后两个位置是否有重复的字母,如果没有,打印那些列表。
final_list = [['5','B','A'],['10','A','B']
最后,我想打印每个列表中的数值:
only_numbers = ['5','10']
但是,我卡在了列表中的识别重复项上。我找到了这个答案 Removing Duplicates from Nested List Based on First 2 Elements,但是当我尝试将其应用于上面的示例代码(和实际代码)时,我得到了一些重复的列表和一些没有重复的列表。
seen = set()
seen_add = seen.add
final_list = [x for x in my_list if tuple(x[-2:]) not in seen and not seen_add(tuple(x[-2:]))]
但我得到:
final_list = [['10', 'A', 'A'], ['5', 'B', 'A'], ['2', 'B', 'B'], ['10', 'A', 'B']]
我错过了什么?
编辑:修正了我在下面的个人编码尝试,以便它的功能(感谢 Karl Knechtel 的解释)
only_numbers = []
for x in my_list:
if not x[1] == x[2]:
add_number.append(x[0])
print(only_numbers)
这是一种使用 filter
和列表理解的方法
例如:
my_list = [['10', 'A', 'A'], ['5', 'B', 'A'], ['2', 'B', 'B'], ['10','A','B']]
result = [i for i, *_ in filter(lambda x: x[-1] != x[-2], my_list)]
# OR
# [i for i, j, k in my_list if j != k]
print(result)
输出:
['5', '10']
我有一个这样的嵌套列表:
my_list = [['10', 'A', 'A'], ['5', 'B', 'A'], ['2', 'B', 'B'], ['10','A','B']]
我想检查最后两个位置是否有重复的字母,如果没有,打印那些列表。
final_list = [['5','B','A'],['10','A','B']
最后,我想打印每个列表中的数值:
only_numbers = ['5','10']
但是,我卡在了列表中的识别重复项上。我找到了这个答案 Removing Duplicates from Nested List Based on First 2 Elements,但是当我尝试将其应用于上面的示例代码(和实际代码)时,我得到了一些重复的列表和一些没有重复的列表。
seen = set()
seen_add = seen.add
final_list = [x for x in my_list if tuple(x[-2:]) not in seen and not seen_add(tuple(x[-2:]))]
但我得到:
final_list = [['10', 'A', 'A'], ['5', 'B', 'A'], ['2', 'B', 'B'], ['10', 'A', 'B']]
我错过了什么?
编辑:修正了我在下面的个人编码尝试,以便它的功能(感谢 Karl Knechtel 的解释)
only_numbers = []
for x in my_list:
if not x[1] == x[2]:
add_number.append(x[0])
print(only_numbers)
这是一种使用 filter
和列表理解的方法
例如:
my_list = [['10', 'A', 'A'], ['5', 'B', 'A'], ['2', 'B', 'B'], ['10','A','B']]
result = [i for i, *_ in filter(lambda x: x[-1] != x[-2], my_list)]
# OR
# [i for i, j, k in my_list if j != k]
print(result)
输出:
['5', '10']