我有一个看起来像这样的列表
[
{'name': 'a', 'value': 'x'},
{'name': 'a', 'value': 'x'},
{'name': 'a', 'value': 'x'},
{'name': 'b', 'value': 'x'},
{'name': 'b', 'value': 'x'},
{'name': 'c', 'value': 'x'}
]
我想将其转换成像这样的字典
{
'a-0': 'x',
'a-1': 'x',
'a-2': 'x',
'b-0': 'x',
'b-1': 'x',
'c': 'x'
}
因此,对于任何重复的名称,我想在所有实例的末尾附加一个索引,但是如果名称不重复,则应保留该名称。
我已经编写了一个函数来执行此操作,但我认为它不是非常有效或通常不会令人愉快。
def transform(mylist):
names = [x['name'] for x in mylist]
duplicates = {x: 0 for x in names if names.count(x) > 1}
out = {}
for row in mylist:
key = row['name']
value = row['value']
if key in duplicates:
newkey = "{key}-{index}".format(key=key, index=duplicates[key])
duplicates[key] = duplicates[key] + 1
else:
newkey = key
out[newkey] = value
return out
有更好的方法吗?
您可以做:
lst = [
{'name': 'a', 'value': 'x'},
{'name': 'a', 'value': 'x'},
{'name': 'a', 'value': 'x'},
{'name': 'b', 'value': 'x'},
{'name': 'b', 'value': 'x'},
{'name': 'c', 'value': 'x'}
]
d = {}
for e in lst:
d.setdefault(e['name'], []).append(e['value'])
result = {}
for key, values in d.items():
if len(values) > 1:
for i, value in enumerate(values):
result[f'{key}-{i}'] = value
else:
result[key] = values[0]
print(result)
输出
{'a-0': 'x', 'a-1': 'x', 'a-2': 'x', 'b-0': 'x', 'b-1': 'x', 'c': 'x'}