繁体   English   中英

根据条件删除 Python 中元组列表的一个元素

[英]Remove an element of list of tuples in Python based on condition

我在 Python 中有一个元组列表:

[(0, 1), (0, 2), (0, 3), (0, 4), (1, 3)......]

可以有更多的元组,其中第一个元素出现超过 3 次。

如果元组的第一个元素出现超过 3 次,如何删除元组。 这里 0,元组的第一个元素,以及第一个元素为 0 的元组出现 4 次。 这个元素(和其他,如果它们出现的话)应该从列表中删除,所以我们得到:

[(0, 1), (0, 2), (0, 3), (1, 3)......]

像这样的东西?

from collections import defaultdict

l = [(0, 1), (0, 2), (0, 3), (0, 4), (1, 3)]

d = defaultdict(list)
l2 = list(filter(lambda x: d[x[0]].append(x[0]) or len(d[x[0]]) < 4, l))

这是l2

[(0, 1), (0, 2), (0, 3), (1, 3)]

这个想法非常简单:您可以将不同的值累积到单独列表中元组的头部,存储在字典中,以便它们的计数对应于这些列表的长度。 filter将当前值添加到对应列表中(追加返回始终为None ),然后检查出现的总数,如果大于 3,则返回 false。

利用append的副作用(使用or )允许使用列表推导而不是for

显然,您可以在完成过滤列表后立即删除d

下面的修复不使用任何defaultdict或其他,但只使用基本的内置对象:

l = [(0, 1), (0, 2), (0, 3), (0, 4), (1, 3)]

o = []

d = {}

for t in l:
    if t[0] not in d.keys():
        d[t[0]] = 1
    else:
        d[t[0]] += 1
    if d[t[0]] <= 3:
        o.append(t)

print (o)

Output:

[(0, 1), (0, 2), (0, 3), (1, 3)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM