【问题标题】:How to iterate through a bunch of lists that are inside of a dictionary?如何遍历字典中的一堆列表?
【发布时间】:2020-02-01 18:41:35
【问题描述】:

我有这本巨大的字典,其中我有一个人的键的键,以及每个人的值列表,这是字典中两个人的示例:

{'NuNu': ['0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '3', '0', '3', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '3', '0', '0', '1', '0', '5', '0', '0', '0', '0', '0', '1', '3', '3', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'], 'Hamza ALi': ['0', '0', '0', '0', '0', '0', '0', '-5', '0', '5', '1', '0', '0', '0', '1', '0', '5', '0', '-3', '0', '3', '0', '0', '0', '0', '0', '0', '-5', '0', '0', '-3', '5', '0', '5', '0', '3', '0', '0', '1', '0', '3', '1', '3', '5', '0', '0', '0', '0', '0', '1', '-5', '0', '0', '0', '0']}

现在,我需要做的是将每个值相乘,例如 0 * 0、0 * 0 等,用于整个值列表,然后将所有值相加。

我已经在另一段代码中完成了这项工作,只是为了两个列表,我将值放入其中。

我不知道如何使用其中包含列表(即值)的字典来做到这一点。

list1 = ['0', '0', '0', '5', '0', '0', '0', '5', '0', '5', '5', '0', '0', '0', '0', '0', '5', '-3', '-3', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '5', '0', '0', '5', '0', '5', '5', '5', '5', '0', '0', '0', '0', '0', '3', '1', '0', '0', '0', '0']
list2 = ['5', '5', '0', '0', '0', '0', '0', '0', '0', '3', '0', '5', '0', '0', '1', '0', '5', '0', '1', '5', '0', '0', '0', '0', '0', '1', '0', '5', '0', '0', '3', '5', '5', '0', '0', '5', '0', '0', '3', '0', '0', '3', '5', '5', '0', '0', '0', '0', '0', '5', '5', '0', '5', '0', '0']

int_list_1 = map(int,list1)
int_list_2 = map(int,list2)

third = map(sum, zip(int_list_1, int_list_2))

product = []

for num1, num2 in zip(int_list_1,int_list_2):
    product.append(num1 * num2)
x = sum(product)

print(x)

^ 这为我提供了我需要的正确值,但我需要帮助为字典内的多个列表设置这段代码。

我知道我需要一个 for 循环,也许是这样的?

sum = 0
for value in dict:
    sum + y
print(sum)

【问题讨论】:

  • dict.values() 将为您提供所有列表。
  • 为什么需要third

标签: python list dictionary


【解决方案1】:

这是我在一般情况下的解决方案。假设我们在字典d 中有n 项。然后我创建了一个具有整数值的列表集合,如下所示:

vals = map(lambda x: [int(n) for n in x], d.values())

之后,我得到了所有元素的元组:

p = zip(*vals)

最后,这是一种计算所有产品的方法:

#from functools import reduce
products = [reduce(lambda x,y: x*y, n) for n in p]
output = sum(products)

另一种方式

由于字典值的长度是平衡的,我们可以使用numpy 动作:

import numpy as np
vals = np.array(list(d.values())).astype(int)
products = np.prod(vals, axis=0)
output = np.sum(products)

【讨论】:

    【解决方案2】:

    你试试这个。

    a={'NuNu': ['0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '3', '0', '3', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '3', '0', '0', '1', '0', '5', '0', '0', '0', '0', '0', '1', '3', '3', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'], 'Hamza ALi': ['0', '0', '0', '0', '0', '0', '0', '-5', '0', '5', '1', '0', '0', '0', '1', '0', '5', '0', '-3', '0', '3', '0', '0', '0', '0', '0', '0', '-5', '0', '0', '-3', '5', '0', '5', '0', '3', '0', '0', '1', '0', '3', '1', '3', '5', '0', '0', '0', '0', '0', '1', '-5', '0', '0', '0', '0']}
    x,y=a.values()
    x=map(int,x)
    y=map(int,y)
    out=[i*j for i,j in zip(x,y)]
    print(out)
    print(sum(out))
    

    [0, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, -9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9, 0, 0, 5, 0, 15, 0, 0, 0, 0, 0, 1, 9, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    
    37
    

    【讨论】:

      【解决方案3】:

      另一种方法是使用reduce函数:

      from functools import reduce
      
      inDict = {'NuNu': ['0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '3', '0', '3', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '3', '0', '0', '1', '0', '5', '0', '0', '0', '0', '0', '1', '3', '3', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'], 'Hamza ALi': ['0', '0', '0', '0', '0', '0', '0', '-5', '0', '5', '1', '0', '0', '0', '1', '0', '5', '0', '-3', '0', '3', '0', '0', '0', '0', '0', '0', '-5', '0', '0', '-3', '5', '0', '5', '0', '3', '0', '0', '1', '0', '3', '1', '3', '5', '0', '0', '0', '0', '0', '1', '-5', '0', '0', '0', '0']}
      result = sum([reduce(lambda x,y: x*y, map(int,elem)) for elem in zip(*inDict.values())])
      print(result)
      

      输出:

      37
      

      【讨论】:

        【解决方案4】:

        你的想法是对的。对于具有任意数量的键的字典来说,这样的事情怎么样。

        def mul(iterable):
          t = 1
          for i in iterable:
             t *= int(i)
          return t
        
        z = zip(*a.values()) # => [('0', '0'), ('0', '0'), ...]
        m = map(mul, z)      # => [0, 0, ...]
        print(sum(m))        # => 37
        

        编辑

        您可以将 mul 函数替换为 functools.reduce

        from functools import reduce
        
        z = zip(*a.values())
        m = map(lambda t: reduce(lambda x, y: int(x) * int(y), t), z)
        print(sum(m))
        

        现在全部为一行:

        print(sum(map(lambda t: reduce(lambda x, y: int(x) * int(y), t), zip(*a.values()))))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-23
          • 2012-07-07
          • 2023-03-14
          • 2020-05-16
          • 2012-07-04
          • 1970-01-01
          • 2019-11-29
          相关资源
          最近更新 更多