注意原始列表中已存在的更新值
如果起始列表已经包含一个项目"name2" ...
mylist = ["name", "state", "name", "city", "name", "zip", "zip", "name2"]
...那么函数运行时mylist[2]不应该更新为"name2",否则会创建一个新的副本;相反,该函数应该跳转到下一个可用的项目名称"name3"。
mylist_updated = ['name1', 'state', 'name3', 'city', 'name4', 'zip1', 'zip2', 'name2']
这是一个替代解决方案(可能会被缩短和优化),其中包括一个递归函数,用于检查原始列表中的这些现有项目。
mylist = ["name", "state", "name", "city", "name", "zip", "zip", "name2"]
def fix_dups(mylist, sep='', start=1, update_first=True):
mylist_dups = {}
#build dictionary containing val: [occurrences, suffix]
for val in mylist:
if val not in mylist_dups:
mylist_dups[val] = [1, start - 1]
else:
mylist_dups[val][0] += 1
#define function to update duplicate values with suffix, check if updated value already exists
def update_val(val, num):
temp_val = sep.join([str(x) for x in [val, num]])
if temp_val not in mylist_dups:
return temp_val, num
else:
num += 1
return update_val(val, num)
#update list
for i, val in enumerate(mylist):
if mylist_dups[val][0] > 1:
mylist_dups[val][1] += 1
if update_first or mylist_dups[val][1] > start:
new_val, mylist_dups[val][1] = update_val(val, mylist_dups[val][1])
mylist[i] = new_val
return mylist
mylist_updated = fix_dups(mylist, sep='', start=1, update_first=True)
print(mylist_updated)
#['name1', 'state', 'name3', 'city', 'name4', 'zip1', 'zip2', 'name2']
如果您不想更改第一个匹配项。
mylist = ["name", "state", "name", "city", "name", "zip", "zip", "name_2"]
mylist_updated = fix_dups(mylist, sep='_', start=0, update_first=False)
print(mylist_updated)
#['name', 'state', 'name_1', 'city', 'name_3', 'zip', 'zip_1', 'name_2']