2013-10-21 55 views
2

我想知道是否需要兩個列表解析來返回一個set/dict/list的有序對和set/dict/list。這裏是我的意思的例子:python創建一個集合/字典/列表和它的值從單個列表理解的總和

>>> l = ['abc', 'd', 'efgh', 'ij'] 
>>> {i: len(i) for i in l}, sum(len(i) for i in l) 
({'efgh': 4, 'abc': 3, 'ij': 2, 'd': 1}, 10) 

有沒有寫這比重複for i in l內涵更好/更Python的方式?

UPDATE:

我問這個問題,因爲我在考慮寫一個特定lambda的最佳方式;即

>>> l = ['abc', 'd', 'efgh', 'ij'] 
>>> dict_value = lambda l: ({i: len(i) for i in l}, sum(len(i) for i in l)) 
>>> dict_value(l) 
({'efgh': 4, 'abc': 3, 'ij': 2, 'd': 1}, 10) 

我問這個問題,因爲我不使用len()計算我想要的值,而是一個昂貴的計算。如果我定義一個輔助方法而不是lambda來做工作,下面關於for循環的問題確實解決了這個問題。

回答

2

是的,或者你只是使用普通的循環:

d, s = {}, 0 
for i in l: 
    d[i] = len(i) 
    s += len(i) 

列表或設置或字典的理解應該用來創建一個對象;避免嘗試創造副作用。並且不要打折普通循環的效用!

另外,不要猶豫,使用,而不是一個拉姆達功能:

def as_dict_and_total(l): 
    d, s = {}, 0 
    for i in l: 
     d[i] = len(i) 
     s += len(i) 
    return d, s 
+0

問題在於它沒有利用列表解析的速度,這比列表速度快得多。 – qaphla

+0

@qaphla:不* *要快得多,一個循環比2更好。 –

+0

我運行的大多數測試都給列表推導的速度是標準循環的兩倍以上,但我確信這會因操作而異,所以不會爭論這一點。 – qaphla

3

你可以預先計算的長度。我認爲它看起來更乾淨:

>>> l = ['abc', 'd', 'efgh', 'ij'] 
>>> llen = [len(i) for i in l] 
>>> dict(zip(l,llen)), sum(llen) 
({'abc': 3, 'd': 1, 'efgh': 4, 'ij': 2}, 10) 
+0

請注意,字符串長度僅僅是對字符串的簡單屬性查找;這不會給你帶來太多的速度。 –

+0

我知道,但我不認爲OP是真的在尋找速度。其實我大部分時間都不瞭解人們現在用'pythonic'方式所表達的意思。我認爲他們通常只是尋找更短或更清晰的代碼,不管發生了什麼。 –

+0

@HariShankar回覆:'更pythonic'..我明白你的觀點。我認爲速度是答案的一部分。任何人都不應該能夠在代碼中編寫一些可讀性? – Cole

相關問題