将索引附加到Python中有效的重复字符串中

问题描述 投票:1回答:1

我有一个看起来像这样的列表

[
    {'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

有更好的方法吗?

python
1个回答
0
投票

您可以做:

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'}
© www.soinside.com 2019 - 2024. All rights reserved.