【问题标题】:Remove lists within a nested list with duplicates based on last two elements删除嵌套列表中的列表,其中包含基于最后两个元素的重复项
【发布时间】:2021-01-08 04:06:04
【问题描述】:

我有一个这样的嵌套列表:

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)

【问题讨论】:

  • “我找到了这个答案 Removing Duplicates from Nested List Based on First 2 Elements” 当您说“重复”时,您的意思是与其他人完全不同的东西。您想检查 每个子列表中的两个不同元素;另一个代码是关于比较元素在不同子列表之间。在您的示例数据中,您有一个子列表,每个子列表都有一对不同的字母 - AA、AB、BA 和 BB - 这些字母都不等于任何其他字母,因此不会检测到重复。
  • 一般来说,你列出关心每个元素的独立的方式是:首先你想出一个规则告诉你如何处理元素,然后编写理解,以便将规则应用于每个元素。在您的情况下,规则是获取该元素(这也是一个列表)并比较 that 列表中的最后两个值。因此,先编写进行比较的代码。
  • "如果有人有时间,请解释为什么我在下面编写的这段代码的逻辑是错误的" 错误的方式是你得到每个数字的三个副本。这样做的原因是 i 循环是不需要的:您只想 .append 选定的 x[0] 值一次,但每次都通过内部 i 循环附加它。它循环了 3 次,因为您的子列表中有 3 个元素。
  • 也许您自动编写了一个嵌套循环,因为您有嵌套列表。问题是您不会将内部列表视为循环的东西;你有一种特定的方式来查看内部列表中的特定索引。

标签: python duplicates nested-lists


【解决方案1】:

这是使用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']

【讨论】:

    猜你喜欢
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多