2017-06-09 41 views
0

這是我有: 包含子列表如何在子列表重複多次時重命名子列表的元素?

A= [['filename.yaml','0001'],['filename.yaml','0001'],['filename.yaml','0001'], ['fname.yaml','0002'], ['fname.yaml','0002']] 

我想要的清單是當子列表出現不止一次到每個子列表的第一個元素重新命名。 的出認沽應該是:

[['filename_0.yaml','0001'],['filename_1.yaml','0001'],['filename_2.yaml','0001'], ['fname_0.yaml','0002'], ['fname_1.yaml','0002']] 

這是我的代碼:

def asso_name_id(A): 

for sublist in A: 
    if A.count(sublist)>1: 
     for i in range(A.count(sublist)): 
      base=os.path.splitext(os.path.basename(sublist[0]))[0] 
      sublist[0]=base+"_"+str(i)+'.yaml' 

這就是我得到這個代碼:

[['filename_0_1_2.yaml', '0001'], ['filename_0_1.yaml', '0001'], ['filename.yaml', '0001'], ['fname_0_1.yaml', '0002'], ['fname.yaml', '0002']] 

什麼我做錯了,如何能我修復它?

+0

您需要首先獲取重複元素的索引。有一個很好的建議做這個[這裏](https://stackoverflow.com/a/5419576/3254859)。 –

回答

0

在每個子表,你正在檢查多少相同的人也有,那麼你重複x次操作在同一子列表。這就是爲什麼第二個它只做了兩次,因爲第一個不再相同,所以它只能檢測到兩個相同的子列表。相反,試試這個:

#!/usr/bin/python3 
import os 
A= [['filename.yaml','0001'],['filename.yaml','0001'],['filename.yaml','0001'], ['fname.yaml','0002'],['fname.yaml','0002']] 

def asso_name_id(A): 

    for sublist in A 
    if A.count(sublist) > 1: 
      sublist_name = (sublist[0]+'.')[:-1] 
      count = 0 
      for s_list in A: 
       if s_list[0] == sublist_name: 
         base=os.path.splitext(os.path.basename(s_list[0]))[0] 
         s_list[0]= base+"_"+str(count)+".yaml" 
         count += 1 
    return A 

print(asso_name_id(A)) 

輸出:

[['filename_0.yaml', '0001'], ['filename_1.yaml', '0001'], ['filename_2.yaml', '0001'], ['fname_0.yaml', '0002'], ['fname_1.yaml', '0002']] 
+0

這是做的工作。謝謝 – esenes221

+0

@ solly221看看我的解決方案 – void

0

你可以試試這個:

from itertools import chain 
A= [['filename.yaml','0001'],['filename.yaml','0001'],['filename.yaml','0001'], ['fname.yaml','0002'], ['fname.yaml','0002']] 

flattened = list(chain(*A)) 

new_dict = {} 

for i in A: 
    if i[0] not in new_dict: 
     new_dict[i[0]] = 1 

    else: 
     new_dict[i[0]] += 1 

final_list = [] 

for i in A: 
    first = i[0].split(".") 
    new = first[0]+"_"+str(abs(new_dict[i[0]]-flattened.count(i[0]))) 
    final_list.append([new+first[1], i[1]]) 

    new_dict[i[0]] -= 1 

print final_list 

輸出:

[['filename_0yaml', '0001'], ['filename_1yaml', '0001'], ['filename_2yaml', '0001'], ['fname_0yaml', '0002'], ['fname_1yaml', '0002']] 
0
first = map(lambda (first, second): first, A) 
second = map(lambda (first, second): second, A) 
zip([item for sublist in [map(lambda inc: key + "_" + str(inc), range(value)) for key, value in Counter(first).iteritems()] for item in sublist], second) 

不是一個完整的解決方案。仍然需要在yaml上進行字符串分割。操作順序 1.獲取文件名 2.獲取'000X's 3.計算文件名 4.對於每個文件名創建一個新的文件名,其中包含_Y其中Y < =出現次數(使用計數器類) 5.郵編這與2)

0

使用列表解析

import collections 
import itertools as IT 

A= [['filename.yaml','0001'],['filename.yaml','0001'],['filename.yaml','0001'], ['fname.yaml','0002'], ['fname.yaml','0002']] 

counter1 = IT.count(0) 
counter2 = IT.count(0) 

A = [['filename_{0}.yaml'.format(next(counter1)),sub_list[1]] 
     if sub_list[0]=='filename.yaml' else ['fname_{0}.yaml'.format(next(counter2)),sub_list[1]] 
     for sub_list in A ] 

print(A) 

輸出一個簡單的解決方案:

[['filename_0.yaml', '0001'], ['filename_1.yaml', '0001'], ['filename_2.yaml', '0001'], ['fname_0.yaml', '0002'], ['fname_1.yaml', '0002']] 

列表理解說明

對於A中的每個列表(SUB_LIST)如果SUB_LIST [0] 即SUB_LIST的第一個元素是 'filename.yaml',那麼它格式化爲「filename_ {0} .yaml ' else 'fname_ {0} .yaml'其中{0}將保存我們的變量計數器。

使用從0開始的計數器並使用下一個()來遞增計數器。

注意:使用兩個計數器。

+0

這不會限制輸入相當重嗎?如果你在Sublist [0]是'filepath.yaml'的子列表中輸入什麼東西? – dhdavvie

+0

感謝您的回答。但解決方案應該是通用的。我的意思是它必須工作,不管子列表的內容。 – esenes221