我有一个列表
l=['a','b','c','c','a','d']
输出应返回列表中所有重复的元素及其索引
输出:
out = {a:['0','4'],c:['2','3']}
我尝试过
def nextDuplicates(c):
dupl_c = dict()
sorted_ind_c = sorted(range(len(c)), key=lambda x: c[x])
for i in xrange(len(c) - 1):
if c[sorted_ind_c[i]] == c[sorted_ind_c[i+1]]:
dupl_c[ sorted_ind_c[i] ] = sorted_ind_c[i+1]
return dupl_c
答案 0 :(得分:1)
将dict
的理解与list
的理解结合使用(即使发生两次以上):
l = ["a", "b", "c", "c", "a", "d"]
out = {el: [i for i, x in enumerate(l) if x == el] for el in l if l.count(el) > 1}
在您的预期输出中,我看到索引是字符串。我不明白为什么,但是如果您真的希望将它们作为字符串,请将i for i, x
替换为str(i) for i, x
。
答案 1 :(得分:1)
尝试一下:
l=['a','b','c','c','a','d']
o = {}
for i in range(len(l)):
if (l[i] in o):
o[l[i]].append(i)
else:
o[l[i]] = [i]
print({key:val for key, val in o.items() if len(val) > 1})
答案 2 :(得分:1)
使用collections.defaultdict
+ set
迭代可以更快地查找大于1的计数。
from collections import defaultdict
l = ['a','b','c','c','a','d']
result = defaultdict(list)
for x in set(l):
if l.count(x) > 1:
result[x].extend([i for i, y in enumerate(l) if y == x])
print(result)
# defaultdict(<class 'list'>, {'a': [0, 4], 'c': [2, 3]})
答案 3 :(得分:1)
您可以使用此dict理解
l = ["a", "b", "c", "c", "a", "d"]
out = {ele: [str(i) for i, x in enumerate(l) if x == ele] for ele in set(l) if l.count(ele) > 1}
# Output : {'c': ['2', '3'], 'a': ['0', '4']}
与其使用集合对列表本身进行迭代,反而可以改善性能,尤其是当重复项很多时。
在期望的输出中,您需要一个str
列表作为值。如果需要整数,则可以使用i
代替str(i)
答案 4 :(得分:0)
l=['a','b','c','c','a','d']
result = {}
for element in l:
if element not in result:
indexes = [i for i, x in enumerate(l) if x == element]
if len(indexes) > 1:
result[element] = indexes
print(result)
遍历列表,检查元素是否在字典中已经存在。如果没有,则获取该元素的所有索引并将该元素附加到字典中。