在Perl中,我可以這樣做:如何使列表在Python中使用時自動實例化,就像在Perl中一樣?
push(@{$h->[x]}, y);
我可以根據上面的Perl示例簡化以下python代碼嗎?
if x not in h:
h[x] = []
h[x].append(y)
我想簡化這個,因爲它在我的代碼中有很多地方,(我無法使用[]初始化所有可能的x)。我不想讓它成爲一個函數,因爲沒有'inline'關鍵字。
任何想法?
在Perl中,我可以這樣做:如何使列表在Python中使用時自動實例化,就像在Perl中一樣?
push(@{$h->[x]}, y);
我可以根據上面的Perl示例簡化以下python代碼嗎?
if x not in h:
h[x] = []
h[x].append(y)
我想簡化這個,因爲它在我的代碼中有很多地方,(我無法使用[]初始化所有可能的x)。我不想讓它成爲一個函數,因爲沒有'inline'關鍵字。
任何想法?
一個非常優雅的方式(因爲Python 2.5)是使用defaultdict
從「集合」模塊:
>>> from collections import defaultdict
>>> h = defaultdict(list)
>>> h['a'].append('b')
>>> h
defaultdict(<type 'list'>, {'a': ['b']})
defaultdict
就像是一個字典,但使用你傳遞給它創建時取其構造(在這個例子中,列表)提供一個默認值。
我特別喜歡這個方法,因爲1)將變量定義爲defaultdict,並且通常不需要對代碼進行其他更改(除了刪除以前的缺省值)。 2)setdefault是一個可怕的名字:P
您可以使用setdefault
h = {}
h.setdefault(x, []).append(y)
「我不希望把它的功能......」是過早的優化,假設在應用程序中調用的開銷將是足夠高,以克服重複的成本,不太明顯的代碼。 – msw 2010-04-28 03:35:02
使用Python和擔心在線...不一致。 – Stephen 2010-04-28 03:40:13
你都是對的。但這只是故事的一部分。主要擔心的是我必須用調用函數的語法來承擔這個負擔。不管怎麼說,還是要謝謝你。 – aXqd 2010-04-28 05:39:25