python dictionary - Erro:o objeto '' dict 'não possui atributo' iteritems '”



inside list (5)

Em Python2, dictionary.iteritems() é mais eficiente que dictionary.items() portanto, em Python3, a funcionalidade de dictionary.iteritems() foi migrada para dictionary.items() e iteritems() é removida. Então você está recebendo este erro.

Use dict.items() em Python3, que é o mesmo que dict.iteritems() do Python2.

Estou tentando usar o NetworkX para ler um Shapefile e usar a função write_shp() para gerar os Shapefiles que conterão os nós e arestas (seguindo este example <- esse link agora está morto ), mas quando tento executar o código me dá o seguinte erro:

Traceback (most recent call last):   File
"C:/Users/Felipe/PycharmProjects/untitled/asdf.py", line 4, in
<module>
    nx.write_shp(redVial, "shapefiles")   File "C:\Python34\lib\site-packages\networkx\readwrite\nx_shp.py", line
192, in write_shp
    for key, data in e[2].iteritems(): AttributeError: 'dict' object has no attribute 'iteritems'

Estou usando o Python 3.4 e instalei o NetworkX via pip install.

Antes desse erro ele já tinha me dado outro que dizia "xrange não existe" ou algo assim, então eu procurei e apenas mudei xrange para range no arquivo nx_shp.py, que parecia resolvê-lo.

Pelo que eu li, pode estar relacionado à versão do Python (Python2 vs Python3).


Como você está em python3, use dict.items() invés de dict.iteritems()

iteritems() foi removido em python3, então você não pode mais usar este método.

Dê uma olhada na seção Alterações Internas do Wiki do Python 3.0, onde está escrito:

Removido dict.iteritems() , dict.iterkeys() e dict.itervalues() .

Em vez disso: use dict.items() , dict.keys() e dict.values() respectivamente.


Eu tive um problema semelhante (usando 3.5) e perdi 1/2 por dia para isso, mas aqui está algo que funciona - eu estou aposentado e apenas aprendendo Python para que eu possa ajudar meu neto (12) com ele.

mydict2={'Atlanta':78,'Macon':85,'Savannah':72}
maxval=(max(mydict2.values()))
print(maxval)
mykey=[key for key,value in mydict2.items()if value==maxval][0]
print(mykey)
YEILDS; 
85
Macon

Em Python2 , tivemos .items() e .iteritems() em dicionários. dict.items() lista retornada de tuplas no dicionário [(k1,v1),(k2,v2),...] . Copiou todas as tuplas no dicionário e criou uma nova lista. Se o dicionário é muito grande, o impacto da memória é muito grande.

Então eles criaram dict.iteritems() em versões posteriores do Python2. Isso retornou o objeto iterador. O dicionário inteiro não foi copiado para que haja menos consumo de memória. Pessoas que usam Python2 são ensinadas a usar dict.iteritems() vez de .items() para eficiência, conforme explicado no código a seguir.

import timeit

d = {i:i*2 for i in xrange(10000000)}  
start = timeit.default_timer()
for key,value in d.items():
    tmp = key + value #do something like print
t1 = timeit.default_timer() - start

start = timeit.default_timer()
for key,value in d.iteritems():
    tmp = key + value
t2 = timeit.default_timer() - start

Saída:

Time with d.items(): 9.04773592949
Time with d.iteritems(): 2.17707300186

Em Python3 , eles queriam torná-lo mais eficiente, então movido dictionary.iteritems() para dict.items() , e removeu .iteritems() já que não era mais necessário.

Você usou dict.iteritems() no Python3 então ele falhou. Tente usar o dict.items() que tem a mesma funcionalidade que o dict.iteritems() do Python2 . Este é um pequeno problema de migração do Python2 para o Python3 .


Eu gostaria de fornecer uma solução de padronização mais intuitiva com regex. A função abaixo recebe como entrada uma lista de string contendo seqüências arbitrárias.

Explicação passo a passo: Você remove todos os espaços em branco, bracketing e value_separators (desde que não façam parte dos valores que você deseja extrair, senão torne o regex mais complexo). Então você divide a string limpa em aspas simples ou duplas e pega os valores não vazios (ou valores indexados ímpares, qualquer que seja a preferência).

def parse_strlist(sl):
import re
clean = re.sub("[\[\],\s]","",sl)
splitted = re.split("[\'\"]",clean)
values_only = [s for s in splitted if s != '']
return values_only

samplesample : "['21'," foo "'6', '0'," A "]"





python dictionary