我有一个列表:
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)
答案 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函数只映射列表中的每个元素