AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 76923353
Accepted
Sri
Sri
Asked: 2023-08-18 00:18:53 +0800 CST2023-08-18 00:18:53 +0800 CST 2023-08-18 00:18:53 +0800 CST

Como adicionar prefixo/sufixo em uma chave de dicionário repetível em Python

  • 772

Você poderia sugerir alguma maneira de manter todas as chaves repetíveis (duplicadas) adicionando prefixo ou sufixo. No exemplo abaixo, a chave de endereço é duplicada 3 vezes. Pode variar (1 a 3 vezes). Eu quero obter a saída como na saída esperada com a adição de um sufixo para tornar a chave exclusiva. Atualmente, a função de atualização está substituindo o valor da chave.

list = ['name:John','age:25','Address:Chicago','Address:Phoenix','Address:Washington','email:[email protected]']
dic = {}
for i in list:
    j=i.split(':')
    dic.update({j[0]:j[1]})
print(dic)

Saída atual: {'nome': 'João', 'idade': '25', 'Endereço': 'Washington', 'email': 'Joã[email protected]'}

Saída esperada: {'name': 'John', 'age': '25', 'Address1': 'Chicago', 'Address2': 'Phoenix', 'Address3': 'Washington', 'email': 'John @email.com'}

Tentei o abaixo:

list = ['name:John','age:25','Address:Chicago','Address:Phoenix','Address:Washington','email:[email protected]']
dic = {}
for i in list:
    j=i.split(':')
    dic.update({j[0]:j[1]})
print(dic)

Saída esperada: {'name': 'John', 'age': '25', 'Address1': 'Chicago', 'Address2': 'Phoenix', 'Address3': 'Washington', 'email': 'John @email.com'}

python
  • 4 4 respostas
  • 48 Views

4 respostas

  • Voted
  1. fferri
    2023-08-18T00:33:34+08:002023-08-18T00:33:34+08:00

    Não use listcomo um nome de variável. listé o nome de uma classe interna do Python e é usado na solução a seguir. Eu renomeei sua variável de lista l.

    Esta solução consiste em primeiro construir um multidict (usando collections.defaultdict(list)) para armazenar os múltiplos valores:

    import collections
    d = collections.defaultdict(list)
    for entry in l:
        key, value = entry.split(':', 2)
        d[key].append(value)
    

    agora dcontém:

    {'nome': ['John'], 'idade': ['25'], 'Endereço': ['Chicago', 'Phoenix', 'Washington'], 'email': ['[email protected] ']}

    em seguida, repita os valores de de, se houver mais de um, acrescente um sufixo:

    output = {}
    for key, values in d.items():
        if len(values) > 1:
            for i, value in enumerate(values):
                output[f'{key}{i+1}'] = value
        else:
            output[key] = values[0]
    

    saída:

    {'name': 'John', 'age': '25', 'Address1': 'Chicago', 'Address2': 'Phoenix', 'Address3': 'Washington', 'email': 'John@email. com'}

    • 4
  2. Andrej Kesely
    2023-08-18T00:37:19+08:002023-08-18T00:37:19+08:00

    Outra solução (isso itera sobre a lista apenas uma vez):

    lst = [
        "name:John",
        "age:25",
        "Address:Chicago",
        "Address:Phoenix",
        "Address:Washington",
        "email:[email protected]",
    ]
    
    cnts, out = {}, {}
    for k, v in map(lambda s: s.split(":"), lst):
        c = cnts.get(k, 0)
        if c == 0:
            out[k] = v
        elif c == 1:
            out[f"{k}1"] = out.pop(k)
            out[f"{k}2"] = v
        else:
            out[f"{k}{c + 1}"] = v
    
        cnts[k] = c + 1
    
    print(out)
    

    Estampas:

    {
        "name": "John",
        "age": "25",
        "Address1": "Chicago",
        "Address2": "Phoenix",
        "Address3": "Washington",
        "email": "[email protected]",
    }
    
    • 3
  3. Best Answer
    Suraj Shourie
    2023-08-18T00:27:23+08:002023-08-18T00:27:23+08:00

    Você pode usar algo assim:

    list_ = ['name:John','age:25','Address:Chicago','Address:Phoenix','Address:Washington','email:[email protected]']
    
    dic = {}
    for i in list_:
        j = i.split(':')
        key_ = j[0]
        count = 0 # counts the number of duplicates
        while key_ in dic:
            count += 1
            key_ = j[0] + str(count)
        dic[key_] = j[1]
    

    Saída:

    {'name': 'John',
     'age': '25',
     'Address': 'Chicago',
     'Address1': 'Phoenix',
     'Address2': 'Washington',
     'email': '[email protected]'}
    

    PS. não use a palavra-chave python listpara nomear suas variáveis, pois ela substitui o tipolist

    • 1
  4. Alain T.
    2023-08-18T02:23:00+08:002023-08-18T02:23:00+08:00

    Você pode primeiro separar os valores das chaves em duas listas e, em seguida, tornar a lista de chaves exclusiva adicionando sufixos e combinar as chaves exclusivas com os valores em um dicionário no final:

    data = ['name:John','age:25','Address:Chicago',
            'Address:Phoenix','Address:Washington','email:[email protected]']
    
    keys,values = zip(*(s.split(":") for s in data))
    keys        = [ k+str(keys[:i].count(k))*(keys.count(k)>1) 
                    for i,k in enumerate(keys,1) ]
    dic         = dict(zip(keys,values))
    
    print(dic)
    
    {'name': 'John', 
     'age': '25', 
     'Address1': 'Chicago', 
     'Address2': 'Phoenix', 
     'Address3': 'Washington', 
     'email': '[email protected]'}
    

    Observe que isso não cobre os casos em que as chaves com sufixo colidem com as chaves originais. Por exemplo: ["Endereço1:...","Endereço:...","Endereço:..."] produziria um "Endereço1" duplicado adicionando um sufixo à chave "Endereço". Se essa situação pudesse existir em seus dados, seria necessária uma abordagem diferente

    Como alternativa, você pode usar um dicionário para agrupar valores em listas associadas a cada chave e expandir esse dicionário de grupo para produzir chaves distintas:

    grp = dict()
    grp.update( (k,grp.get(k,[])+[v]) for s in data for k,v in [s.split(":")] )
    dic = { k+str(i or ''):v for k,g in grp.items() 
                             for i,v in enumerate(g,len(g)>1) }
    
    print(dic)
    
    {'name': 'John', 
     'age': '25', 
     'Address1': 'Chicago', 
     'Address2': 'Phoenix', 
     'Address3': 'Washington', 
     'email': '[email protected]'}
    

    Embora grpele próprio possa ser mais fácil de manipular no código subseqüente:

    print(grp)
    
    {'name':    ['John'], 
     'age':     ['25'], 
     'Address': ['Chicago', 'Phoenix', 'Washington'], 
     'email':   ['[email protected]']}
    
    • 1

relate perguntas

  • Como divido o loop for em 3 quadros de dados individuais?

  • Como verificar se todas as colunas flutuantes em um Pandas DataFrame são aproximadamente iguais ou próximas

  • Como funciona o "load_dataset", já que não está detectando arquivos de exemplo?

  • Por que a comparação de string pandas.eval() retorna False

  • Python tkinter/ ttkboostrap dateentry não funciona quando no estado somente leitura

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve