在Python中从列表中删除相同的行

0 投票
1 回答
607 浏览
提问于 2025-04-17 23:00

我在Python中有一个列表,里面包含了多个列表。
我想要删除那些第一个元素已经在某个块中的行。

block = [
    ['alfa', 'T31360N', '2013-12-19 12:07:2'],
    ['beta', 'D41535N', '2013-12-19 12:20:1'],
    ['gamma', 'E61460N', '2013-12-19 13:58:2'],
    ['delta', 'D133PR01', '2013-12-19 14:19:4'],
    ['beta', 'Q3332N', '2013-12-19 14:19:5']
]

我该怎么做才能从这个列表中删除以'beta'开头的行呢?

1 个回答

3

把这个如何在保留顺序的情况下从列表中删除重复项的方法应用到你的列表上:

seen = set()
block = [row for row in block if row[0] not in seen and not seen.add(row[0])]

这个方法会重建 block,只保留那些第一个元素是唯一的行;也就是说,只保留每个第一个值的第一行。

如果你想只保留唯一的行,并删除所有有多个相同值的行,你需要使用一个collections.Counter()对象来统计每个第一个元素出现的次数,然后block进行修剪:

from collections import Counter

counts = Counter(row[0] for row in block)
block = [row for row in block if counts[row[0]] == 1]

示例:

>>> from pprint import pprint
>>> from collections import Counter
>>> block = [
...     ['alfa', 'T31360N', '2013-12-19 12:07:2'],
...     ['beta', 'D41535N', '2013-12-19 12:20:1'],
...     ['gamma', 'E61460N', '2013-12-19 13:58:2'],
...     ['delta', 'D133PR01', '2013-12-19 14:19:4'],
...     ['beta', 'Q3332N', '2013-12-19 14:19:5']
... ]
>>> seen = set()
>>> pprint([row for row in block if row[0] not in seen and not seen.add(row[0])])
[['alfa', 'T31360N', '2013-12-19 12:07:2'],
 ['beta', 'D41535N', '2013-12-19 12:20:1'],
 ['gamma', 'E61460N', '2013-12-19 13:58:2'],
 ['delta', 'D133PR01', '2013-12-19 14:19:4']]
>>> counts = Counter(row[0] for row in block)
>>> pprint([row for row in block if counts[row[0]] == 1])
[['alfa', 'T31360N', '2013-12-19 12:07:2'],
 ['gamma', 'E61460N', '2013-12-19 13:58:2'],
 ['delta', 'D133PR01', '2013-12-19 14:19:4']]

撰写回答