我需要创建一个不包含一次以上显示的元素的元素字典,我想保留起始索引。 示例:
a = ['a', 'b' 'a', 'c']
expected = {'b': 1, 'c': 3}
要解决此问题,我尝试过这种方式:
def unique_array(foo):
correct, duplicates = {}, set()
for value in foo:
if index, value not in enumerate(correct):
correct[value] = index
else:
duplicates.add(value)
return {k: correct[k] for k in set(correct) - duplicates
有更好,更有效的方法吗?
答案 0 :(得分:3)
一种解决方案是使用Counter
和两次通过。 (仍然是O(n)。)
>>> from collections import Counter
>>> a = ['a', 'b', 'a', 'c']
>>> counts = Counter(a)
>>> {k:idx for idx, k in enumerate(a) if counts[k] == 1}
{'b': 1, 'c': 3}
答案 1 :(得分:1)
您有两个交叉的循环,这使得代码的时间复杂度为O(n ^ 2)。
O(n)解决方案可能是:
a = ['a', 'b', 'a', 'c']
out = {}
for index, val in enumerate(a):
if val not in out:
out[val] = index
else:
out[val] = None
out = {item:val for item, val in out.items() if val is not None}
print(out)
# {'b': 1, 'c': 3}
我们首先创建输出,在遇到重复项时将其标记为值None
。
最后,我们用None
值过滤掉键。这两个操作都是O(n)。
答案 2 :(得分:0)
您可以通过一个循环来实现
alphabets = ['a', 'b', 'a', 'c']
alphabetDict = {}
index = 0
for alphabet in alphabets:
count = alphabets.count(alphabet)
if count == 1:
alphabetDict[alphabet] = index
index += 1
else:
index += 1
continue
print(alphabetDict)