【问题标题】:Python: Dividing values of nested list with values with values of dictionaryPython:将嵌套列表的值与字典值相除
【发布时间】:2018-12-10 13:39:51
【问题描述】:

我有一个清单:

mylist = [['A',4,2,5], ['C',3,9,5], ['D',2,5,6]]

还有一本字典:

mydict = {'A' : 2, 'B' : 6, 'C' : 3}

如果嵌套列表的第一个值与mydict的键匹配,我想将嵌套列表与mydict的值分开。

mylist2 应该如下所示:

mylist2 = [['A',2,1,2.5], ['C',1,3,1.66666666667], ['D',2,5,6]]

我是 python 新手,尝试了很多,例如这但它没有工作:

mylist2 = []
for item in mylist:
    if item[0] == list(mydict.keys()):
        mylist2 = mylist[0][1:] / list(mydict.keys())
print(mylist2)

【问题讨论】:

  • 您需要在列表元素上进行第二次循环并划分每个元素。

标签: python python-3.x list dictionary


【解决方案1】:

您可以使用嵌套列表推导式,使用key, *rest 解压缩mylist 的元素并使用dict.get 获取除数或1 作为默认值:

>>> [[key] + [x/mydict.get(key, 1) for x in rest] for key, *rest in mylist]
[['A', 2.0, 1.0, 2.5],
 ['C', 1.0, 3.0, 1.6666666666666667],
 ['D', 2.0, 5.0, 6.0]]

【讨论】:

    【解决方案2】:

    单个字符 (item[0]) 不能等于所有 dict.keys() 的列表,即 ['A','B','C']

    if item[0] == list(mydict.keys()):
    

    您需要检查item[0] 是否为in dict:

    mylist = [['A',4,2,5], ['C',3,9,5], ['D',2,5,6]] 
    
    mydict = {'A' : 2, 'B' : 6, 'C' : 3}
    
    mylist2 = []
    for item in mylist:
        key, *vals = item   # split into key and rest of list
        if key in mydict:
            mylist2.append([key])  # create new list, append it, fill it with key
            for val in vals:
                mylist2[-1].append(val/mydict[key])  # add the other numbers to last inner list
        else:
            mylist2.append(item[:])  # add a copy of item
    print(mylist2)
    

    输出:

    [['A', 2.0, 1.0, 2.5], ['C', 1.0, 3.0, 1.6666666666666667], ['D', 2, 5, 6]]
    

    这是“长”版本 - 您可以使用 dict.get(key,1) 减少它,默认情况下返回键的值或 1 和一个列表组合以使其“更流畅” - 请参阅 Tobias_k solution

    【讨论】:

      【解决方案3】:

      类似的东西(快速而肮脏,可能是一个更优雅的解决方案,但希望它对您有所帮助):

      mydict = {'A' : 2, 'B' : 6, 'C' : 3}
      mylist = [['A',4,2,5], ['C',3,9,5], ['D',2,5,6]]
      
      for k,v in mydict.items():
          for j in mylist:
              if k == j[0]:
                  j[1] = j[1] / v
                  j[2] = j[2] / v
                  j[3] = j[3] / v
      
      print(mylist)
      

      【讨论】:

        【解决方案4】:

        Hii B.T 我已经根据您的要求使用了列表理解,如果您想试试这个:

          mydict = {'A' : 2, 'B' : 6, 'C' : 3}
          mylist = [['A',4,2,5], ['C',3,9,5], ['D',2,5,6]]
        
          print map(lambda x:map(lambda y:float(y/mydict.get(x[0],1)) if not isinstance(y,str) else y,x),mylist) 
        
          Result:[['A', 2.0, 1.0, 2.0], ['C', 1.0, 3.0, 1.0], ['D', 2.0, 5.0, 6.0]]
        

        我希望你不需要解释,map 函数只是映射到列表中的每个元素

        【讨论】:

        • 这是 python 2 - 不是要求的 python3。 map 在 python3 中不返回任何列表,而 print 是一个函数。
        • @PatrickArtner 哎呀!我没看到,好吧反正答案已经得到了 mehrdad-pedramfar ;) 。好提醒!
        猜你喜欢
        • 1970-01-01
        • 2021-10-20
        • 2017-06-17
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多