2017-10-13 67 views
2

我完全是新編程(少於2個月 - 自學),我正在研究一個項目,它需要一個列表的頻率列表中的每個內部列表的前兩個索引。優化頻率列表中的每個項目的兩個第一個值

這是我的列表:

X = [[ '塊',3],[ '街道',2],[ '燈',1],[ '街道',2], ['industrial',3],['park',2],['park',3],['industrial',3], ['block',3],['street',2], [ '燈',1],[ '街道',2],[ '工業', 3],[ '暫停',2]]

所以在每個內列表中的第一個值是一個TITLE第二個是傳統價值。

重要的是,你可以看到它們中的一些被重複(重複)。

我想列表的這樣的輸出列表:


P = [[ '塊',3,2],[ '街道',2,4],[ '燈' ,1,2],[ '工業', 3,3],[ '暫停',2,2],[ '暫停',3,1]]

與第三值作爲頻率內部列表中的外部列表x中。

所以這裏是我的非Python的(也許平淡)做法:


x = [['block', 3], ['street', 2], ['lamp',1], ['street', 2], ['industrial', 3], ['park', 2], ['park', 3], ['industrial', 3], ['block', 3], ['street', 2], ['lamp',1], ['street', 2], ['industrial', 3], ['park', 2]] 
p = [] 

for a in x: 
    p.append(a), a.append(x.count(a)) 

print p # checkpoint 

i= 0 
while i < len(p): 
    for j in range(len(p)): 
     if i == j: 
      print i, ' = ', j 
      break 
     else: 
      if p[i][:2] == p[j][:2]: 
       print p[i][:2], '==', p[j][:2] 
       p.pop(i) 
       i = 0 
       j=0 
       break 
    i = i+1 

print p # the list of lists I'm desired 

,但我的項目,因爲這個功能,然後其他的功能,相較於他們這一項高運行時間,尤其是大量輸入數據集。

因爲我缺乏的知識我無法優化我寫的代碼。

所以我問有沒有更快捷,更pythonic的方式來做到這一點?

回答

1

是的,使用字典。我假設的順序問題,所以我會用一個OrderedDict,但你可以考慮Counter對象,如果順序並不重要:

>>> from collections import OrderedDict 
>>> counter = OrderedDict() 
>>> for a, b in x: 
...  t = (a, b) 
...  counter[t] = counter.get(t, 0) + 1 
... 
>>> final = [[a, b, v] for (a,b),v in counter.items()] 
>>> final 
[['block', 3, 2], ['street', 2, 4], ['lamp', 1, 2], ['industrial', 3, 3], ['park', 2, 2], ['park', 3, 1]] 

只注意到你在Python 2裏(如果你能幫助它,你應該真的使用Python 3),在這種情況下,因爲你使用的是Python 2,所以你應該使用counter.iteritems()而不是counter.items()

因此,像:

>>> final = [[a, b, count] for (a, b), count in counter.iteritems()] 
>>> final 
[['block', 3, 2], ['street', 2, 4], ['lamp', 1, 2], ['industrial', 3, 3], ['park', 2, 2], ['park', 3, 1]] 

注意,你的第一個for循環是秤平方,並作爲該while循環,我不喜歡思考,我想,也許二次以及,但可能更糟糕(因爲你.pop(i)),但我上面發佈的解決方案線性縮放。所以它應該能夠有效地處理更大的數據集。

+0

感謝您的回答。代碼是完美的。但是當我看到這個時,我不知道你是如何得到這個的。我怎樣才能提高自己的思維編碼能力,以更像你的方法進行編碼?這是必須通過時間來實現的嗎? –

+1

@AshshinSalehi很多練習和看到類似的問題。 –

相關問題