我有两个列表。一个包含代表姓名的字符串,另一个包含代表人员的整数。每个名称都有各自的编号,我可以访问每个名称,因为它们在同一索引上。但是,有很多重复的名称,我想删除所有重复的名称。我想到了使用一个集合来删除重复项,然后将其转换回这样的列表:
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
答案 0 :(得分:2)
您可以做的一件事是将Name
和Number
压缩在一起,然后做出命令。由于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循环或尝试获取预排序的数组。