【问题标题】:Create dictionary where keys are from a list and values are the sum of corresponding elements in another list创建字典,其中键来自列表,值是另一个列表中相应元素的总和
【发布时间】:2016-06-15 08:59:26
【问题描述】:

我有两个列表 L1 和 L2。 L1 中的每个唯一元素都是在第二个列表 L2 中具有值的键。我想创建一个字典,其中的值是 L2 中与 L1 中的同一键相关联的元素的总和。

我做了以下,但我对这段代码并不感到自豪。有没有更简单的pythonic方法?

L = [2, 3, 7, 3, 4, 5, 2, 7, 7, 8, 9, 4] # as L1
W = range(len(L)) # as L2

d = { l:[] for l in L }
for l,w in zip(L,W): d[l].append(w)
d = {l:sum(v) for l,v in d.items()}

编辑:

问:我如何知道 L2 的哪些元素与 L1 的给定关键元素相关联?

答:如果它们具有相同的索引。例如,如果元素 7 在 L1 中重复 3 次(例如 L1[2] == L1[7] == L1[8] = 7),那么我希望键 7 的值是 L2[2]+ L2[7]+L2[8]

【问题讨论】:

  • 你如何知道 L2 的哪些元素与 L1 的给定关键元素相关联?
  • @eguaio 如果它们具有相同的索引。例如,如果元素 7 在 L1 中重复 3 次(例如 L1[2] == L1[7] == L1[8] = 7),那么我希望键 7 的值是 L2[2]+ L2[7]+L2[8]

标签: python list dictionary


【解决方案1】:

您可以使用enumerate() 在循环列表时访问项目的索引并使用collections.defaultdict()(通过传递int,因为它缺少函数,第一次将被评估为0)来保留遇到重复键时添加项目并添加值:

>>> from collections import defaultdict

>>> d = defaultdict(int)
>>> for i,j in enumerate(L):
...     d[j]+=i
... 
>>> d
defaultdict(<type 'int'>, {2: 6, 3: 4, 4: 15, 5: 5, 7: 17, 8: 9, 9: 10})

【讨论】:

    【解决方案2】:

    如果您不需要lists 的中间dict,您可以使用collections.Counter

    import collections
    L = [2, 3, 7, 3, 4, 5, 2, 7, 7, 8, 9, 4] # as L1
    W = range(len(L)) # as L2
    
    d2 = collections.Counter()
    for i, value in enumerate(L):
        d2[value] += i
    

    表现得像一个普通的字典:

    Counter({2: 6, 3: 4, 4: 15, 5: 5, 7: 17, 8: 9, 9: 10})
    

    【讨论】:

    • 更新了答案以显示Counter 相对于defaultdict 的优势。
    • 最后一个表达式产生的结果与您首先提供的解决方案不同。 W[i] 不会是 W 中相应键的最后一个值的总和。
    • 是的,在您发表评论之前不久,我也注意到了这一点,我看看能不能解决它。
    【解决方案3】:

    希望对你有所帮助。

    L = [2, 3, 7, 3, 4, 5, 2, 7, 7, 8, 9, 4] # as L1
    dict_a = dict.fromkeys(set(L),0)
    for l,w in enumerate(L):    
        dict_a[w] = int(dict_a[w]) + l
    

    【讨论】:

      猜你喜欢
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 2019-09-25
      相关资源
      最近更新 更多