Python:将嵌套列表中的值与字典中的值分开
我有一份清单:Python:将嵌套列表中的值与字典中的值分开,python,python-3.x,list,dictionary,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新手,尝试了很多,例如,这个,但不
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)
比如(快速而肮脏,可能是一个更优雅的解决方案,但希望它能帮助你):
单个字符(item[0]
)不能等于所有dict.keys()
的列表,这将是['A','B','C']
:
您需要检查项[0]
是否在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)
来减少此值,默认情况下返回key或1的值,并使用列表comp使其更“光滑”-请参见Tobias_k您可以使用嵌套列表理解,使用键,*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]]
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,而不是python 3<代码>映射
在python3中不返回列表,打印是一个函数。@PatrickArtner oops!我没看到,好吧,不管怎样,答案已经由mehrdad pedramfar得到;)。好提醒!
>>> [[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]]
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]]