我有一个列表,看起来像这样
[
    {'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有没有更好的方法来做这件事?
发布于 2019-10-17 18:55:12
你可以这样做:
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'}发布于 2019-10-17 19:01:33
它可以在两个循环中完成。例如,第一个对所有键使用相同的规则,第二个固定单个值。如果inp是输入列表:
from collections import Counter
cnt = Counter()
res = dict()
# First create keys with number
for o in inp:
    new_key = o["name"] + "-" + str(cnt[o["name"]])
    res[new_key] = o["value"]
    cnt[o["name"])] += 1
# Then fix single keys
for name, n in cnt.items():
    if n == 1:
        key = f"{name}-0"
        value = res[key]
        del res[key]
        res[name] = value
res
> {'a-0': 'x', 'a-1': 'x', 'a-2': 'x', 'b-0': 'x', 'b-1': 'x', 'c': 'x'}https://stackoverflow.com/questions/58430884
复制相似问题