【问题标题】:How to create a dictionary from list without the repeating elements如何从没有重复元素的列表中创建字典
【发布时间】:2019-11-10 08:54:09
【问题描述】:

我需要创建一个没有多次显示元素的元素字典,并且我想保留起始索引。 示例:

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

有更好更有效的方法吗?

【问题讨论】:

    标签: python logic


    【解决方案1】:

    一种解决方案是使用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}
    

    【讨论】:

      【解决方案2】:

      您有两个叠瓦式循环,这使您的代码的时间复杂度为 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)。

      【讨论】:

      • @Austin 我认为 enumerate() 算作内部循环。
      • @Thierry 你当然可以 del out[val] 然后删除最后一行?
      • @quamrana 不,因为这样做会丢失 val 已经被看到两次的信息,如果它出现第三次,它将再次被计为单个值。
      • 好的,我现在明白了。
      • 是的,很难看,但是‘in enumerate()’每次通过外循环都必须遍历‘正确’。
      【解决方案3】:

      你可以通过使用单个循环来做到这一点

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-10
        • 2014-06-29
        • 1970-01-01
        • 1970-01-01
        • 2018-03-20
        • 1970-01-01
        相关资源
        最近更新 更多