我有一个清单
In [4]: a = [1, 2, 3, 3, 2, 4]
我想通过使用哨兵清单的理解力从中删除重复项(请参阅下面的原因):
In [8]: [x if x not in seen else seen.append(x) for x in a]
Out[8]: [1, 2, 3, 3, 2, 4]
似乎没有考虑到可见(既未更新,也未选中)。为什么会这样呢?
至于使用卷积方法的原因:我的列表的格式为
[{'a': 3, 'b': 4}, {'a': 10, 'b': 4}, {'a': 5, 'b': 5}]
并且我想根据特定键的值删除重复项(b
在上述情况下,请离开[{'a': 3, 'b': 4}, {'a': 5, 'b': 5}]
(我不在乎删除哪个dict)。这个想法是用的值构建一个前哨列表,b
并仅保留不b
等于该前哨列表中任何元素的字典。
由于x
不在中seen
,因此您永远不会将其添加到seen
任何一个中;在else
当不执行的分支x not in seen
是真实的。
但是,您正在使用条件表达式。它总是产生一个价值;任一x
或的结果seen.append()
(这是None
),所以你不过滤,你是映射在这里。
如果要过滤,请将测试移至循环后的某个if
部分:for
seen = set()
[x for x in a if not (x in seen or seen.add(x))]
既然您正在使用,seen.append()
我想您正在使用一个列表。我改用了a set()
,因为使用一组成员资格测试要快得多。
因此x
,仅当a)为true(因此我们已经看过)或返回true值(不为true)时才将其排除。是的,即使有些麻烦,也可以使用。x in seen
seen.append(x)
None
演示:
>>> a = [1, 2, 3, 3, 2, 4]
>>> seen = set()
>>> [x for x in a if not (x in seen or seen.add(x))]
[1, 2, 3, 4]
>>> seen
set([1, 2, 3, 4])
将此应用于您的特定问题:
>>> a = [{'a': 3, 'b': 4}, {'a': 10, 'b': 4}, {'a': 5, 'b': 5}]
>>> seen = set()
>>> [entry for entry in a if not (entry['b'] in seen or seen.add(entry['b']))]
[{'a': 3, 'b': 4}, {'a': 5, 'b': 5}]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句