如何从列表中创建没有重复元素的字典

时间:2019-11-10 08:54:09

标签: python logic

我需要创建一个不包含一次以上显示的元素的元素字典,我想保留起始索引。 示例:

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

有更好,更有效的方法吗?

3 个答案:

答案 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)