基于2个元素的列表列表去重方法

3
我有一个看起来像这样的列表嵌套列表:
[[Joel,Green,597], [Katie,Higgins,623], [Joel,Green,123], ...]

我想通过查看名字和姓氏来删除列表的元素(具有相同名字和姓氏的元素应该被删除)。在上面的例子中,结果列表应该只包含:
[[Katie,Higgins,623]]

我已经尝试了下面的代码,但它只在某些列表的三个元素完全相同的情况下执行去重:
newlist = []
reader = csv.reader(f,delimiter=",")  # read content
my_list = list(reader) #put content in my_list
for i in my_list:
    if i not in newlist:
        newlist.append(i)

有人能帮忙吗?


那不是一个正确的列表,请修复。 - Mad Physicist
3个回答

9

使用DataFrame.drop_duplicates方法:

pd.read_csv(filename, header=None, names=['first','last','val']) \
  .drop_duplicates(['first','last'], keep=False) \
  .values.tolist()

来自文档:

keep : {‘first’, ‘last’, False}, default ‘first’

first : Drop duplicates except for the first occurrence.
last : Drop duplicates except for the last occurrence.
False : Drop all duplicates.

5

既然你在这里标记了pandas,那就使用pandas的方式,通过使用drop_duplicates函数实现。

pd.Series(l).apply(pd.Series).drop_duplicates([0,1],keep=False).values.tolist()
Out[1267]: [['Katie', 'Higgins', 623]]

更多信息:

l=[['Joel','Green',597], ['Katie','Higgins',623], ['Joel','Green',123]]

4

在这里,最好使用一个计数器(Counter)来跟踪名字和姓氏的元组。我们可以采用两次算法:

  1. 首先构建计数器(Counter);
  2. 接下来筛选列表。

我们可以这样做:

<b>from collections import Counter
from operator import itemgetter</b>

reader = csv.reader(f,delimiter=",")
my_list = list(reader)

<b>getter = itemgetter(0,1)</b>

<b>counter = Counter(map(getter, my_list))</b>

new_list = [item for item in my_list <b>if counter[getter(item)] <= 1</b>]

所以我们会将列表中的所有项过滤掉,如果getter(item)(包含前两个项的元组)已经出现了两次或更多次。


你是不是想说 <= 1 - Mad Physicist
谢谢回复。我该如何将被删除项目的全名打印到单独的 .txt 文件中? - davdis
通过使用 csv 库将其反序列化。 - Willem Van Onsem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接