![](/img/trans.png)
[英]pythonic way of parsing a string into a dictionary with dict comprehension
[英]Pythonic way to achieve a list/dict comprehension
比方說,我有一個元組列表:
lst = [('NP', (2, 4)), ('VP', (1, 4)), ('VP', (0, 4)),
('S-SBJ', (0, 4)), ('ADJP-PRD', (5, 7)), ('VP', (4, 7))]
獲得以下內容的最標准/pythonic 方式是什么:
out = {(2, 4): 1, (1, 4): 1, (0, 4): 2, (5, 7): 1, (4, 7): 1}
我試着做:
from collections import defaultdict
d = defaultdict(list)
for item in lst:
d[item[1]].append(item[0])
dct = {}
for k, v in d.items():
dct[k] = len(v)
print(dct)
# {(2, 4): 1, (1, 4): 1, (0, 4): 2, (5, 7): 1, (4, 7): 1}
我會使用一個Counter
:
>>> from collections import Counter
>>> lst = [('NP', (2, 4)), ('VP', (1, 4)), ('VP', (0, 4)),
... ('S-SBJ', (0, 4)), ('ADJP-PRD', (5, 7)), ('VP', (4, 7))]
>>> c = Counter(item[1] for item in lst)
>>> c
Counter({(0, 4): 2, (2, 4): 1, (1, 4): 1, (5, 7): 1, (4, 7): 1})
您可以使用itertools.groupby
:
from itertools import groupby as gb
lst = [('NP', (2, 4)), ('VP', (1, 4)), ('VP', (0, 4)), ('S-SBJ', (0, 4)), ('ADJP-PRD', (5, 7)), ('VP', (4, 7))]
r = {j:i for _, b in gb(lst, key=lambda x:x[0]) for i, j in enumerate(b, 1)}
Output:
{('NP', (2, 4)): 1, ('VP', (1, 4)): 1, ('VP', (0, 4)): 2, ('S-SBJ', (0, 4)): 1, ('ADJP-PRD', (5, 7)): 1, ('VP', (4, 7)): 1}
如果您正在尋找純粹的理解:
>>> lst = [('NP', (2, 4)), ('VP', (1, 4)), ('VP', (0, 4)),
... ('S-SBJ', (0, 4)), ('ADJP-PRD', (5, 7)), ('VP', (4, 7))]
>>> {tup[1]: sum([1 for itup in lst if itup[1] == tup[1]]) for tup in lst}
{(2, 4): 1, (1, 4): 1, (0, 4): 2, (5, 7): 1, (4, 7): 1}
>>>
但是上面的理解是相當簡潔的。 可讀的方式是:
>>> d = {};
>>> for x, y in lst:
... d[y] = 1 if y not in d else d[y] + 1
...
>>> d
{(2, 4): 1, (1, 4): 1, (0, 4): 2, (5, 7): 1, (4, 7): 1}
>>>
然而,OP 的defaultdict
解決方案也是可讀的; 但我會使用0
作為默認值,然后在每次匹配時遞增1
。 這樣,您就不需要額外的循環來計算len
。
我看到的最簡單的方法是:
from collections import Counter
d = dict(Counter([i[1] for i in lst]))
它准確地給出了您要求的 output:
{(2, 4): 1, (1, 4): 1, (0, 4): 2, (5, 7): 1, (4, 7): 1}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.