从列表列表创建字典并获取python中的最大键

时间:2017-07-26 14:06:45

标签: python list dictionary

我正在尝试从列表列表中创建字典。我创建了一个类似我正在做的事情的例子,它是这样的:

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']]

5 个答案:

答案 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))]