【发布时间】: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