在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ 寫一個python列表生成

寫一個python列表生成

如何將
[(a, 1), (b, 2), (a, 3)]
轉成
{
a: [1, 3]
b: [2]
}

想用一個列表生成來做,有什么好的方法么?

回答
編輯回答
陌如玉

《流暢的Python》中第 80 頁,也就是第三章的 3.9.3 小節(jié)內容 —— 《dict 的實現(xiàn)及其導致的結果》中明確提到:

  • 不要對字典同時進行個迭代和修改。你的需求,此處使用字典生成式,會觸及到此處,會形成意想不到的問題。{k:[].append(v) for k, v in [('a', 1), ('b', 2), ('a', 3)]}
  • 如果非要這樣,那么先對字典迭代,以得出需要添加的內容,把這些內容放在一個新字典里,迭代結束后,再對原有字典進行更新。建議你使用 @vibiu @Lin_R 的版本。

這主要由于 dict 的實現(xiàn)方式確定的,建議有空看看“散列沖突”的問題。

2018年3月2日 17:12
編輯回答
心癌

不是一個列表生成的:

from collections import defaultdict
s = [('a', 1), ('b', 2), ('a', 3)]
d = defaultdict(list)
for k, v in s:
    d[k].append(v)
print(d.items())
2017年9月10日 17:25
編輯回答
局外人

個人覺得 列表生成不適合用來做這些操作, 規(guī)范點會比較好

from collections import defaultdict

result = defaultdict(list)
s = [('a', 1), ('b', 2), ('a', 3)]
for i in s:
    result[i[0]].append(i[1])
2017年5月8日 23:17
編輯回答
毀與悔

感謝各位的回答,我找到一個比較好的備選方案

>>> from itertools import groupby
>>> from operator import itemgetter
>>> lst = [("a", 1), ("b", 2), ("a", 3)]
>>> {k: list(map(itemgetter(1), g)) for k, g in groupby(sorted(lst, key=itemgetter(0)), key=itemgetter(0))}
{'a': [1, 3], 'b': [2]}
2018年3月6日 01:21
編輯回答
我以為

這個多像mapreduce的map操作

2018年5月13日 19:37
編輯回答
獨白
s = [('a', 1), ('b', 2), ('a', 3)]
l = {'a':[i[1] for i in s if i[0] == 'a'],
     'b':[i[1] for i in s if i[0] == 'b']
     }

這個意思?

2017年6月18日 21:30