2010-04-28 47 views
4

在Perl中,我可以這樣做:如何使列表在Python中使用時自動實例化,就像在Perl中一樣?

push(@{$h->[x]}, y); 

我可以根據上面的Perl示例簡化以下python代碼嗎?

if x not in h: 
    h[x] = [] 
h[x].append(y) 

我想簡化這個,因爲它在我的代碼中有很多地方,(我無法使用[]初始化所有可能的x)。我不想讓它成爲一個函數,因爲沒有'inline'關鍵字。

任何想法?

+3

「我不希望把它的功能......」是過早的優化,假設在應用程序中調用的開銷將是足夠高,以克服重複的成本,不太明顯的代碼。 – msw 2010-04-28 03:35:02

+0

使用Python和擔心在線...不一致。 – Stephen 2010-04-28 03:40:13

+0

你都是對的。但這只是故事的一部分。主要擔心的是我必須用調用函數的語法來承擔這個負擔。不管怎麼說,還是要謝謝你。 – aXqd 2010-04-28 05:39:25

回答

9

一個非常優雅的方式(因爲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

3

您可以使用setdefault

h = {} 
h.setdefault(x, []).append(y) 
4

有一對夫婦的方式與dict methods做到這一點:

h.setdefault(x, []).append(y) 

h[x] = h.pop(x,[]).append(y) 
+0

流行()方法是聰明的:P – aXqd 2010-04-28 05:40:15

+0

'POP()'很可愛,但也比較慢,因爲'h.pop'方法修改'h'兩次,而'h.setdefault'方法通常只修改了該列表H [X]。換句話說,'setdefault'有一個很好的理由存在。 :) – EOL 2010-04-28 07:05:03

相關問題