Sou um programador C desenvolvendo algo em python. Eu sei como fazer o seguinte em C (e, portanto, em lógica semelhante a C aplicada a python), mas estou me perguntando qual é a maneira 'Python' de fazer isso.
Eu tenho um dicionário d, e gostaria de operar em um subconjunto de itens, apenas aqueles cuja chave (string) contém uma substring específica.
ou seja, a lógica C seria:
for key in d:
if filter_string in key:
# do something
else
# do nothing, continue
Estou imaginando que a versão python seria algo como
filtered_dict = crazy_python_syntax(d, substring)
for key,value in filtered_dict.iteritems():
# do something
Eu encontrei muitos posts aqui sobre filtragem de dicionários, mas não consegui encontrar um que envolvesse exatamente isso.
Meu dicionário não está aninhado e estou usando o python 2.7
python
python-2.7
dictionary
filtering
memorando
fonte
fonte
Respostas:
Que tal uma compreensão de dicionário :
Se você ver, deve ser autoexplicativo, já que se parece muito bem com o inglês.
Esta sintaxe requer Python 2.7 ou superior.
No Python 3, existe apenas
dict.items()
, nãoiteritems()
então você usaria:fonte
filtered_dict = {k:d[k] for k in d if filter_string in k}
?d[k]
pesquisa.# do something
nos comentários, mas deixamos cair algumas chaves aqui.iteritems
em Python 3? Acho que não. Então, minha versão seria compatível, não?iteritems
poritems
, que é igual ao do Python 2.7iteritems
.Escolha o que for mais legível e de fácil manutenção. Só porque você pode escrever em uma única linha, não significa que você deve. Sua solução existente é próxima do que eu usaria, exceto iteritems de usuário para pular a pesquisa de valor, e odeio ifs aninhados se eu puder evitá-los:
No entanto, se você realmente deseja algo que permita a iteração por meio de um dicionário filtrado, então eu não faria o processo de duas etapas de construção do dicionário filtrado e, em seguida, iterá-lo, mas em vez disso, usaria um gerador, porque o que é mais pythônico (e incrível) do que um gerador?
Primeiro, criamos nosso gerador, e um bom design exige que o tornemos abstrato o suficiente para ser reutilizável:
E então podemos usar o gerador para resolver seu problema de forma limpa e simples com um código simples e compreensível:
Resumindo: os geradores são fantásticos.
fonte
Você pode usar a função de filtro embutida para filtrar dicionários, listas, etc. com base em condições específicas.
A vantagem é que você pode usá-lo para diferentes estruturas de dados.
fonte
items:
deve estaritem:
na definição lambda.fonte
iteritems()
vai ser mais eficiente do queitems()
.items()
, que atua como o do Python 2.7iteritems
.Jonathon deu a você uma abordagem usando compreensões de dicionário em sua resposta . Aqui está uma abordagem que lida com sua parte de fazer algo .
Se você quiser fazer algo com os valores do dicionário, não precisa de uma compreensão de dicionário:
Estou usando
iteritems(
) já que você marcou sua pergunta compython-2.7Agora o resultado estará em uma lista com
some_function
aplicada a cada par chave / valor do dicionário, que possuifoo
em sua chave.Se você deseja apenas lidar com os valores e ignorar as chaves, basta alterar a compreensão da lista:
some_function
pode ser qualquer chamável, então um lambda também funcionaria:A lista interna não é necessária, pois você também pode passar uma expressão geradora para mapear:
fonte
map(lambda a: a[0]*a[1], ((k,v) for k,v in {2:2, 3:2}.iteritems() if k == 2))
- isso vai dar a você[4]
.map
é uma compreensão de lista.[f(v) for k, v in d.iteritems() if substring in k]
Acho que é muito mais legível e mais eficiente.results = list(starmap(...))
ou seja, oufor result in starmap(...): ...
).