从列表中删除重复项,并在python

时间:2019-06-17 16:56:58

标签: python list duplicates

我有两个列表。一个包含代表姓名的字符串,另一个包含代表人员的整数。每个名称都有各自的编号,我可以访问每个名称,因为它们在同一索引上。但是,有很多重复的名称,我想删除所有重复的名称。我想到了使用一个集合来删除重复项,然后将其转换回这样的列表:

names = (list(set(names)))

但是,现在我该如何保持与集合中所保存元素相同的电话号码。

一个例子。

之前:

Index    Name        Number
0        Alexander   12345
1        Elena       45678
2        John        76542
3        Alexander   43256
4        John        45024
5        David       69438   

之后:

NewIndex Name        Number
0        Alexander   12345
1        Elena       45678
2        John        76542
3        David       69438   

3 个答案:

答案 0 :(得分:2)

您可以做的一件事是将NameNumber压缩在一起,然后做出命令。由于dict基于键的值仅散列 ,因此该值仍与名称相关联,但保持不变:

name_dict = dict(zip(names, numbers))
new_names, new_numbers = zip(*list(name_dict.items()))

现在,new_names仍按索引对应于new_numbers,但是应该没有重复的元素了。


此方法的一个警告是,给定名称的 last 出现是其数字优先的(例如"Alexander"对应于43256,而不是{ {1}})。您应该能够通过执行12345来切换dict(reversed(zip(names, numbers)))读取和分配键的顺序来解决此问题。

答案 1 :(得分:1)

您可以使用dict.setdefault()来存储在词典中找到的默认名字:

data = [
    ('Alexander', 12345),
    ('Elena', 45678),
    ('John', 45678),
    ('Alexander', 43256),
    ('John', 45024),
    ('David', 69438)
]

result = {}
for name, number in data:
    result.setdefault(name, number)

print(list(result.items()))
# [('Alexander', 12345), ('Elena', 45678), ('John', 45678), ('David', 69438)]

答案 2 :(得分:0)

对于此数组

arr = [ ['Alexander',   12345],
        ['Elena',       45678],
        ['John',        76542],
        ['Alexander',   43256],
        ['John',        45024],
        ['David',       69438] ]

假设您想保留第一个遇到的号码,

names = [a[0] for a in arr]
names_unique = list(set(names))

newarr = [ [name, arr[names.index(name)][1] ] for name in names_unique ]

这将产生:

[['Elena',      45678],
 ['David',      69438],
 ['Alexander',  12345],
 ['John',       76542]]

这不是更快的解决方案,但是对于长度小于一百万的数组,将在一秒钟内完成。 .index对于大型数组可能非常昂贵,因此在这种情况下,您可以使用经典的单for循环或尝试获取预排序的数组。