2017-07-26 80 views
0

我試圖從列表中創建一個字典。我創建了一個例子,類似我工作的事,這是這樣的:從列表中創建字典並獲取python中的最大密鑰

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

我可以看到這個錯誤我做的是迭代lst2lst1內循環以便鍵和值分配多次。但我需要的輸出這樣的

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

編輯:

謝謝大家對您的回答,反覆停止,一旦它找到最大值如何讓所有的最大值的鑰匙。對於如:

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

爲什麼'max_mydict'列表*列表*? –

+0

你爲什麼要創建字典來查找'max_mydict'? –

+0

對不起,輸入錯誤,我想max_mydict看起來像那樣。現在糾正它 – Watarap

回答

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

非常感謝您的回答,效果很好。在你的第一個代碼的第五行末尾有一個缺失的括號,顯示出錯誤。 – Watarap

1

您可以使用以下列表理解。 荏苒第二次從第一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

要生成你可以使用的字典

>>> [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對象,如果您只需要th對應於最大高值e的字母:

>>> [max(z)[1] for z in map(zip, lst2, lst1)] 
['b', 'a', 'b'] 
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'] 
-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))] 
+0

爲什麼downvote? – Ajax1234