Python:将嵌套列表的值除以字典值的值

时间:2018-12-10 13:39:52

标签: python python-3.x list dictionary

我有一个列表:

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)

4 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分: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 :(得分:0)

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

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)

答案 3 :(得分:0)

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函数只映射列表中的每个元素