我正在尝试从列表列表中创建字典。我创建了一个类似我正在做的事情的例子,它是这样的:
lst1 = [['a','b','c'],['d','e','a'],['g','b','i']]
lst2 = [[1,8,2],[4,3,6],[7,9,0]]
我试过这样的事情
mydict = [dict(zip(keys,values)) for keys in lst1 for values in lst2]
print (mydict)
# Prints like this below
#[{'a': 1, 'b': 8, 'c': 2}, {'a': 4, 'b': 3, 'c': 6}, {'a': 7, 'b': 9, 'c': 0}, {'d': 1, 'e': 8, 'a': 2}, {'d': 4, 'e': 3, 'a': 6}, {'d': 7, 'e': 9, 'a': 0}, {'g': 1, 'b': 8, 'i': 2}, {'g': 4, 'b': 3, 'i': 6}, {'g': 7, 'b': 9, 'i': 0}]
我可以看到我正在做的错误是在lst2
循环内迭代lst1
,因此键和值被多次分配。但我需要输出一些像这样的东西
{{'a': 1, 'b': 8, 'c': 2}, {'d': 4, 'e': 3, 'a': 6}, {'g': 7, 'b': 9, 'i': 0}}
我想保留列表的结构并为字典创建键和值,我可以使用它来获取字典的最大键。 所以我的最终目标是获得这个
"""
In the mydict
{{'a': 1, 'b': 8, 'c': 2},
{'d': 4, 'e': 3, 'a': 6},
{'g': 7, 'b': 9, 'i': 0}}
the key 'b' has max_value of 8,
the key 'a' has max_value of 6,
the key 'b' has max_value of 9.
#the output i need is [['b'],['a'],['b']]
"""
编辑:
感谢大家的回答,一旦找到最大值,迭代就会停止,如何获得具有最大值的所有键。对于Eg:
lst1 = [['a','b','c'],['d','e','a'],['g','b','i']]
lst2 = [[1,8,2],[4,3,6],[7,9,9]]
需要输出
[['b'], ['a'], ['b','i']]
答案 0 :(得分:3)
要生成可以使用的词典
>>> [dict(z) for z in map(zip, lst1, lst2)]
[{'a': 1, 'b': 8, 'c': 2}, {'d': 4, 'e': 3, 'a': 6}, {'g': 7, 'b': 9, 'i': 0}]
但是,如果您只需要与最大值对应的字母,则不必创建dict
个对象:
>>> [max(z)[1] for z in map(zip, lst2, lst1)]
['b', 'a', 'b']
答案 1 :(得分:2)
您可以使用max_mydict
获取zip
没有中间词典。
这基本上找到list2
中每个子列表中的最大项目索引,然后从list1
中提取相应的值。
>>> [a[max(range(len(b)), key=b.__getitem__)] for a, b in zip(lst1, lst2)]
['b', 'a', 'b']
分两步:
>>> indices = (max(range(len(x)), key=x.__getitem__) for x in lst2)
>>> [x[next(indices)] for x in lst1]
['b', 'a', 'b']
答案 2 :(得分:1)
您可以使用以下列表理解。 Zipping 第二次成对列出第一个zip
并在其中调用dict
:
l = [dict(zip(x, y)) for x, y in zip(lst1, lst2)]
print l
# [{'a': 1, 'c': 2, 'b': 8}, {'a': 6, 'e': 3, 'd': 4}, {'i': 0, 'b': 9, 'g': 7}]
您可以使用以下内容生成最大值:
print [[max(d, key=d.get)] for d in l]
# [['b'], ['a'], ['b']]
答案 3 :(得分:1)
您的更新意味着您需要使用循环来提高效率,例如:
In []:
r = []
for xs, ys in zip(lst1, lst2):
m = max(ys)
r.append([x for x, y in zip(xs, ys) if y == m])
r
Out[]:
[['b'], ['a'], ['b', 'i']]
这里是低效率(多次调用max()
)理解版本:
In []:
[[x for x, y in zip(xs, ys) if y == max(ys)] for xs, ys in zip(lst1, lst2)]
Out[]:
[['b'], ['a'], ['b', 'i']]
如果您真的想要创建一个dict
,那么我会颠倒关系并将数字作为关键,例如:
In []:
r = []
for xs, ys in zip(lst1, lst2):
d = {}
for x, y in zip(xs, ys):
d.setdefault(y, []).append(x)
r.append(d)
r
Out[]:
[{1: ['a'], 2: ['c'], 8: ['b']}, {3: ['e'], 4: ['d'], 6: ['a']}, {7: ['g'], 9: ['b', 'i']}]
然后获得最大值:
In []:
[d[max(d)] for d in r]
Out[]:
[['b'], ['a'], ['b', 'i']]
答案 4 :(得分:-1)
你可以试试这个:
lst1 = [['a','b','c'],['d','e','a'],['g','b','i']]
lst2 = [[1,8,2],[4,3,6],[7,9,0]]
final = [{c:d for c, d in zip(a, b)} for a, b in zip(lst1, lst2))]