首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >高效地将索引追加到Python中的重复字符串

高效地将索引追加到Python中的重复字符串
EN

Stack Overflow用户
提问于 2019-10-17 18:51:26
回答 2查看 70关注 0票数 1

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

代码语言:javascript
运行
复制
[
    {'name': 'a', 'value': 'x'},
    {'name': 'a', 'value': 'x'},
    {'name': 'a', 'value': 'x'},
    {'name': 'b', 'value': 'x'},
    {'name': 'b', 'value': 'x'},
    {'name': 'c', 'value': 'x'}
]

我想把它转换成像这样的字典

代码语言:javascript
运行
复制
{
    'a-0': 'x',
    'a-1': 'x',
    'a-2': 'x',
    'b-0': 'x',
    'b-1': 'x',
    'c':   'x'
}

因此,对于任何重复的名称,我希望将索引附加到所有实例的末尾,但如果该名称不是重复的,则应该将其保留。

我已经写了一个函数来做这件事,但我不认为它是非常有效或通常令人愉快的。

代码语言:javascript
运行
复制
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

有没有更好的方法来做这件事?

EN

回答 2

Stack Overflow用户

发布于 2019-10-17 18:55:12

你可以这样做:

代码语言:javascript
运行
复制
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)

输出

代码语言:javascript
运行
复制
{'a-0': 'x', 'a-1': 'x', 'a-2': 'x', 'b-0': 'x', 'b-1': 'x', 'c': 'x'}
票数 2
EN

Stack Overflow用户

发布于 2019-10-17 19:01:33

它可以在两个循环中完成。例如,第一个对所有键使用相同的规则,第二个固定单个值。如果inp是输入列表:

代码语言:javascript
运行
复制
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'}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58430884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档