2010-05-14 50 views
4

下面是一個包含重複的列表:如何追加計數數字在Python中的列表中重複?

l1 = ['a', 'b', 'c', 'a', 'a', 'b']

這裏是理想的結果:

l1 = ['a', 'b', 'c', 'a_1', 'a_2', 'b_1']

如何能重複通過附加一個計數改名?


這是試圖達到這個目標;然而,是否有更多的Pythonic方式?

for index in range(len(l1)): 
    counter = 1 
    list_of_duplicates_for_item = [dup_index for dup_index, item in enumerate(l1) if item == l1[index] and l1.count(l1[index]) > 1] 
    for dup_index in list_of_duplicates_for_item[1:]: 
     l1[dup_index] = l1[dup_index] + '_' + str(counter) 
     counter = counter + 1 
+0

我想你想'a_1'而不是'a'_1? – exupero 2010-05-14 21:36:22

+0

對不起,其'a_1'=) – myeu2 2010-05-14 22:13:20

回答

5

我會做這樣的事情:

a1 = ['a', 'b', 'c', 'a', 'a', 'b'] 
a2 = [] 

d = {} 

for i in a1: 

    d.setdefault(i, -1) 
    d[i] += 1 

    if d[i] >= 1: 
     a2.append('%s_%d' % (i, d[i])) 
    else: 
     a2.append(i) 

print a2 
1

我想你問的輸出是凌亂的本身,所以它創造沒有乾淨的方式。

你打算如何使用這個新列表?像下面這樣的計數字典會起作用嗎?

{'a':3, 'b':2, 'c':1} 

如果是的話,我會建議:

from collections import defaultdict 
d = defaultdict(int) # values default to 0 
for key in l1: 
    d[key] += 1 
+0

嘿!感謝所有的答覆。 =)我想保留重複的原因是因爲列表實際上是一個字典列表,我不想無意中覆蓋同一個鍵。 =) – myeu2 2010-05-14 21:39:10

17

在Python中,產生一個新的列表通常比改變現有列表要容易得多。我們有發電機來有效地做到這一點。字典可以保持發生的次數。

l = ['a', 'b', 'c', 'a', 'a', 'b'] 

def rename_duplicates(old): 
    seen = {} 
    for x in old: 
     if x in seen: 
      seen[x] += 1 
      yield "%s_%d" % (x, seen[x]) 
     else: 
      seen[x] = 0 
      yield x 

print list(rename_duplicates(l)) 
+0

+1我寫了同樣的解決方案作爲一個類,但是這樣比較好,生成器比這類作品的類更加pythonic,正如我看到的那樣。 – daramarak 2010-05-14 22:39:25

+0

此解決方案適用於我,但我想追加一個字母而不是數字。 '看過[x] + = 1; character = str(chr(96 + seen [x]));產量「%s_%s」%(x,字符);' – 2017-05-15 13:10:26

0

基於您的評論對@mathmike,如果你的最終目標是創建重複鍵列表的字典,我會用一個defaultdict從`收藏庫。

>>> from collections import defaultdict 
>>> multidict = defaultdict(list) 
>>> multidict['a'].append(1) 
>>> multidict['b'].append(2) 
>>> multidict['a'].append(11) 
>>> multidict 
defaultdict(<type 'list'>, {'a': [1, 11], 'b': [2]})